问题
In python, I can do something like this:
List=[3, 4]
def Add(x, y):
return x + y
Add(*List) #7
Is there any way to do this or something similar in C#? Basically I want to be able to pass a List of arguments to an arbitrary function, and have them applied as the function's parameters without manually unpacking the List and calling the function explicitly specifying the parameters.
回答1:
Well, the closest would be reflection, but that is on the slow side... but look at MethodInfo.Invoke...
回答2:
You can use the params keyword when defining your method and then you can directly put your list (after calling ToArray) in your method call.
public static void UseParams(params object[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + " ");
}
Console.WriteLine();
}
...which you can later call with the following.
object[] myObjArray = { 2, 'b', "test", "again" };
UseParams(myObjArray);
For reference: http://msdn.microsoft.com/en-us/library/w5zay9db.aspx
回答3:
you cant, you can do things that are close with a bit of hand waving (either yield to a foreach, or add a foreach extension method on the collection that takes a lambda), but nothing as elegant as you get in python.
回答4:
With LINQ you can do this which is pretty close to your example.
var list = new List<int> { 3, 4 };
var sum = list.Sum();
回答5:
Func<List<float>, float> add = l => l[0] + l[1];
var list = new List<float> { 4f, 5f };
add(list); // 9
or:
Func<List<float>, float> add = l => l.Sum();
var list = new List<float> { 4f, 5f };
add(list); // 9
Is the closest you get in c# considering it's statically typed. You can look into F#'s pattern matching for exactly what you're looking for.
来源:https://stackoverflow.com/questions/568280/python-like-list-unpacking-in-c