传递可变数量的参数

时间:2009-05-27 16:08:17

标签: c#

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

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:11)

你可以用params做到这一点,但是params需要是一些类或结构来保存你的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...
    }
}

同样的事情适用于params,即:

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

然而,这迫使你制作一个数组。使用IEnumerable<T>将使用数组,但也可以使用值列表或LINQ查询结果等。这使得在许多情况下生成调用此函数更容易。

答案 2 :(得分: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 ) {}

答案 3 :(得分:0)

另一个答案是:你可以用一个简单的对象数组和params来做到这一点。

    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);
        }
    }

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

传递具有适当结构的字典或列表会更好:)