Распаковка списка, похожего на Python, в C #? - PullRequest
8 голосов
/ 20 февраля 2009

В Python я могу сделать что-то вроде этого:

List=[3, 4]

def Add(x, y):
    return x + y

Add(*List) #7

Есть ли способ сделать это или нечто подобное в C #? По сути, я хочу иметь возможность передавать список аргументов произвольной функции и применять их в качестве параметров функции, не распаковывая вручную список List и не вызывая функцию, явно указывающую параметры.

Ответы [ 5 ]

6 голосов
/ 20 февраля 2009

Ну, самое близкое было бы отражение, но это медленная сторона ... но посмотрите на MethodInfo.Invoke ...

3 голосов
/ 04 октября 2011

Вы можете использовать ключевое слово 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);

Для справки: http://msdn.microsoft.com/en-us/library/w5zay9db.aspx

1 голос
/ 20 февраля 2009

вы не можете, вы можете делать вещи, которые близки, немного помахав рукой (либо уступить foreach, либо добавить метод расширения foreach в коллекцию, которая принимает лямбду), но ничего более элегантного, чем вы получаете в python .

1 голос
/ 20 февраля 2009

С LINQ вы можете сделать это, что очень близко к вашему примеру.

 var list = new List<int> { 3, 4 };
 var sum = list.Sum();
0 голосов
/ 20 февраля 2009
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 # именно тому, что вы ищете.

...