3

これを行うマッピング関数が欲しいのですが:

public static void Map<T>(IEnumerable<T> src, params T[] dst)
{
    for (int i = 0; i < dst.Length; i++)
        dst[i] = src.ElementAt(i);
}

この作業を行うには、dstもrefとして宣言する必要がありますが、これは不可能のようです。

ここでは、虚数単位テストで使用されます。

int a = 0, b = 0, c = 0;
int[] arr = { 1, 2, 3 };
Tools.Map(arr, a, b, c);
Assert.AreEqual(a, 1);
Assert.AreEqual(b, 2);
Assert.AreEqual(c, 3);

これは可能ですか?すでに存在しますか?それは悪い考えでしょうか?

編集:言い換えると、この実装に任意の数の引数を与えるにはどうすればよいですか?

public static void Map3<T>(IEnumerable<T> src, ref T a, ref T b, ref T c)
{
   a = src.ElementAt(0);
   b = src.ElementAt(1);
   c = src.ElementAt(2);
}
4

1 に答える 1

4

そんなことはできません。Params は、その場で配列を作成し、引数を入力するだけの C# コンパイラの便利な機能です。

配列には「ref」変数を含めることはできないため、この方法で「ref」を params に渡すこともできません。

一部の言語にある「複数代入」のようなものを探しています。存在する場合、次のように機能します。

my (a,b,c,d) = enumerable.ToArray();

参照: C#: 文字列を分割し、結果を複数の文字列変数に割り当てる

一連の拡張メソッドを検討できます。

public static void ReadValues<T>(this T[] array, ref T t0){
   t0 = array[0];
}
public static void ReadValues<T>(this T[] array, ref T t0, ref T t1){
   t0 = array[0];
   t1 = array[1];
}

など、サポートしたい数のパラメーターまで。

これは任意の数値ではありませんが、ほとんどの目的には 20 で十分です。そうでない場合は、もっと高くしてください。

次に、次のように使用できます。

enumerable.ToArray().ReadValues(var1, var2, var3);    

これを Slice と組み合わせて、任意のエントリを読み取ることもできます。

// reads indexes 3 to 7
enumerable.ToArray().Slice(3,4).ReadValues(var1, var2,var3,var4); 

ここでスライスを参照してください:

于 2012-06-25T09:51:09.823 に答える