C # лямбда-выражения в качестве аргументов функции - PullRequest
17 голосов
/ 22 марта 2011

В последнее время я был занят погружением в лямбда-выражения, и есть некоторые специфические функции, которые я хотел изучить, но, похоже, просто не мог сделать из них головы или хвосты.

Предположим, у меня естьследующая логика в моем коде:

List<A> foo; // assuming this is populated
string[] bar = foo.Select<A,string>(x => x.StringProperty).ToArray<string>();

Теперь я хочу, возможно, абстрагировать всю эту операцию в метод-обработчик, чтобы я мог сделать это вместо этого:

string[] bar = MakeArray<A,string>(foo, x => x.StringProperty);
int[] foobar = MakeArray<A,int>(foo, x => x.IntegerProperty);

Как бы япойти с написанием тела этого метода?Я предвижу объявить подпись как что-то вроде:

U[] MakeArray<T,U>( /* some lambda magic? */ ) where T : IEntity {}

, но я не знаю, как указать, что я ожидаю лямбда-выражения в качестве аргумента метода, и как это точно переводит в телоМетод.

Кто-нибудь может показать мне, как создать функцию MakeArray() выше?Я почти уверен, что как только увижу, как это делается, я смогу оттуда его забрать.

РЕДАКТИРОВАТЬ

Как указано в комментариях, MakeArray() нужна ссылка на IEnumerable<>.Обновлено, чтобы отразить это.

Ответы [ 5 ]

16 голосов
/ 22 марта 2011
public static U[] MakeArray<T, U>(this IEnumerable<T> @enum, Func<T, U> rule)
{
    return @enum.Select(rule).ToArray();
}
13 голосов
/ 22 марта 2011

Попробуйте следующее

U[] MakeArray<T,U>(Func<T, U> projection) where T : IEntity {
  ...
}

При передаче лямбды в качестве аргументов вы обычно хотите, чтобы соответствующий параметр был делегатом.В большинстве случаев вы должны просто использовать соответствующее значение Action<> или Func<>.Первый для void, возвращающего лямбды, а второй для тех, которые возвращают значения.

2 голосов
/ 22 марта 2011

Вы можете использовать классы Func и Action.Посмотрите на подпись функции LINQ Where для примера: http://msdn.microsoft.com/en-us/library/bb534803.aspx

2 голосов
/ 22 марта 2011

Вы ищете Action<> и Func<>.

1 голос
/ 22 марта 2011

Вы можете создать расширение

public static class MakeArrayExtension
{
    public static U[] MakeArray<T, U>(this IEnumerable<T> collection, Func<T,U> func)
    {
        return collection.Select(func).ToArray();
    }
}

И затем использовать его вот так

List<A> foo; // assuming this is populated
string[] bar = foo.MakeArray<A,string>(x => x.StringProperty);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...