我有一个方法
public void method(params object[][] arg)
但是在我调用方法的地方,我有对象[]和对象[] []:
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];
...
我该如何调用该方法?
答案 0 :(得分:3)
这听起来像你想要的:
object[][] args = new[] { var1 }.Concat(var2).ToArray();
method(args);
C#的“普通”参数数组处理没有做任何展平:你 用一个已经是正确类型的参数调用它,或你用一系列元素类型的参数调用它。你不能混合搭配。
答案 1 :(得分:1)
通常,对于接受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);