2

我有一个方法

public void method(params object[][] arg)

但是在我调用该方法的地方,我有 object[] 和 object[][]:

object[] var1 = new object[5];
object[][] var2 = new object[8][5];
method(var1, var2); (I´d like this to be method(var1, var2[0], var2[1], var2[2],...)

但在方法内部,arg 的长度为 2:

arg[0] = var1
arg[1] = var2

但我希望 arg 作为长度为 9 的数组:

arg[0] = var1
arg[1] = var2[0];
arg[2] = var2[1];
... 

如何调用该方法?

4

2 回答 2

4

听起来你想要:

object[][] args = new[] { var1 }.Concat(var2).ToArray();
method(args);

C# 的“普通”参数数组处理不会进行任何展平:您可以使用已经是正确类型的单个参数调用它,或者使用元素类型的参数序列调用它。你不能混搭。

于 2013-02-26T12:42:27.913 回答
2

一般来说,对于接受params数组的方法,我还提供了一个接受的重载IEnumerable<T>

public void MyMethod(params string[] args)
{
    MyMethod((IEnumerable<string>)args);
}

public void MyMethod(IEnumerable<string> args)
{
    // ...
}

然后,您还可以轻松地提供一个可枚举作为参数。例如:

string[] var1 = new string[5];
string[][] var2 = new string[8][5];

// Jon Skeet's suggestion without ToArray():
var sequence = new[] { var1 }.Concat(var2);
MyMethod(sequence);

如果您真的想使用您建议的语法,您可以这样做,因为在您的示例中您使用object[]. 对象数组也是一个对象,因此您可以方法中进行展平:

public void MyMethod(params object[] args)
{
    object[] flattened = arg
        // For each element that is not in an array, put it in an array.
        .Select(a => a is object[] ? (object[])a : new object[] { a })
        // Select each element from each array.
        .SelectMany(a => a)
        // Make the resulting sequence into an array.
        .ToArray();
    // ...
}

MyMethod(var1, var2);
于 2013-02-26T13:53:49.647 回答