传递可变数量的参数

问题描述 投票:0回答:4

我需要编写一个带有可变数量参数的函数。我读了一些关于 params[] 的内容,但我认为这不适用于我的情况。我的函数需要采用可变数量的整数,然后为每个整数提供相应的布尔值。我必须遍历每个组合并将它们输入数据库。只是寻找有人为我指明正确的方向。谢谢。

c#
4个回答
16
投票

我建议构建一个结构,然后将它们作为参数传递。在我的示例中,您的结构代表某种分数:

public struct RaceScore
{
     public bool FinishedRace;
     public int Points;
}

您的方法签名将是:

public void SaveScores(params RaceScore[] scores)

以下是调用 SaveScores 的示例:

RaceScore score = new RaceScore() { FinishedRace = true, Points = 20 };
RaceScore score2 = new RaceScore() { FinishedRace = false, Points = 15 };
SaveScores(score, score2);

11
投票

您可以使用参数来做到这一点,但参数必须是保存 int + bool 的类或结构。如果您不想编写自己的类或结构,则基类库中的

KeyValuePair<TKey,TValue>
可以工作。

不过,如果您要迭代它们,我建议使用

IEnumerable<T>
,因为它使用起来更简单。

例如:

public void SaveValues(IEnumerable<KeyValuePair<int,bool>> values)
{
    foreach(var pair in values)
    {
        int intVal = pair.Key;
        bool boolVal = pair.Value;
        // Do something here...
    }
}

同样的事情也适用于参数,即:

public void SaveValues(params KeyValuePair<int,bool>[] values)

但这会迫使您创建一个数组。使用

IEnumerable<T>
将适用于数组,但也适用于值列表或 LINQ 查询结果等。这使得在许多情况下生成调用此函数更容易。


5
投票

没错 - 它不会像描述的那样工作。您可以做的是使用结构来连接 int 和 bool 值。结构参数正在工作:

public struct IntBoolStruct {
   public bool BoolValue;
   public int IntValue;
}

public void YourMethod( params IntBoolStruct[] values ) {}

编辑:根据您想要执行的操作,可空 int 也可能对您有帮助。

public void YourMethod( params int?[] values ) {}

0
投票

另一个答案:您可以使用简单的对象数组和参数来完成此操作。

        class paramstest {
            private void _passALot(params Object[] values) {
                System.Console.WriteLine(" [foreach]");

               foreach (object o in values) {
                    System.Console.Write(o.ToString() + ", ");
                }

                System.Console.WriteLine(System.Environment.NewLine + " [for]");

                for (int i = 0; i < values.Length; i += 2) {
                    int? testval = values[i] as Int32?;
                    bool? testbool = values[i + 1] as Boolean?;

                    System.Console.WriteLine(String.Format("Int: {0}, Bool: {1}", testval, testbool));
                }
            }

            public void test() {
                _passALot(1, true, 2, false, 3, true, "q", false);
            }
        }

给你

[foreach]
1, True, 2, False, 3, True, q, False,
 [for]
Int: 1, Bool: True
Int: 2, Bool: False
Int: 3, Bool: True
Int: , Bool: False

通过适当的结构传递

Dictionary<int, bool>
List<struct>
会更好:)

© www.soinside.com 2019 - 2024. All rights reserved.