Pythonでは、次のようなことができます:
List=[3, 4]
def Add(x, y):
return x + y
Add(*List) #7
C#でこれを行う方法や同様の方法はありますか? 基本的に、引数のリストを任意の関数に渡し、リストを手動でアンパックしてパラメーターを明示的に指定して関数を呼び出すことなく、それらを関数のパラメーターとして適用できるようにしたいと考えています。
Pythonでは、次のようなことができます:
List=[3, 4]
def Add(x, y):
return x + y
Add(*List) #7
C#でこれを行う方法や同様の方法はありますか? 基本的に、引数のリストを任意の関数に渡し、リストを手動でアンパックしてパラメーターを明示的に指定して関数を呼び出すことなく、それらを関数のパラメーターとして適用できるようにしたいと考えています。
まあ、最も近いのはリフレクションですが、それは遅い側です...しかし、MethodInfo.Invokeを見てください...
メソッドを定義するときに params キーワードを使用すると、(ToArray を呼び出した後に) リストをメソッド呼び出しに直接配置できます。
public static void UseParams(params object[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + " ");
}
Console.WriteLine();
}
...後で次のように呼び出すことができます。
object[] myObjArray = { 2, 'b', "test", "again" };
UseParams(myObjArray);
少し手を振るだけで近いことを行うことはできますが (foreach に譲るか、ラムダを取るコレクションに foreach 拡張メソッドを追加します)、Python で得られるほどエレガントなものはありません。
Func<List<float>, float> add = l => l[0] + l[1];
var list = new List<float> { 4f, 5f };
add(list); // 9
また:
Func<List<float>, float> add = l => l.Sum();
var list = new List<float> { 4f, 5f };
add(list); // 9
静的に型付けされていることを考えると、C# で得られる最も近いものです。まさに探しているものについて、F# のパターン マッチングを調べることができます。