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

しかし、長さ9の配列としてargが必要です。

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 に答える