Ответ 1
public static U[] MakeArray<T, U>(this IEnumerable<T> @enum, Func<T, U> rule)
{
return @enum.Select(rule).ToArray();
}
Недавно я занимался дайвингом в лямбда-выражениях, и там была определенная функциональность, которую я хотел узнать, но просто не мог создать головы или хвосты.
Предположим, что в моем коде есть следующая логика:
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<>
. Обновлено, чтобы отразить это.
public static U[] MakeArray<T, U>(this IEnumerable<T> @enum, Func<T, U> rule)
{
return @enum.Select(rule).ToArray();
}
Попробуйте выполнить
U[] MakeArray<T,U>(Func<T, U> projection) where T : IEntity {
...
}
При передаче lambdas в качестве аргументов вы обычно хотите, чтобы параметр соответствия был делегатом. В большинстве случаев вы должны просто использовать соответствующее значение Action<>
или Func<>
. Первый для пустоты, возвращающей лямбды, а второй для тех, которые возвращают значения.
Вы ищете Action<>
и Func<>
.
Вы можете использовать классы Func и Action. Проверьте пример функции LINQ Where: http://msdn.microsoft.com/en-us/library/bb534803.aspx
Вы можете создать расширение
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);