С# лямбда-выражения в качестве аргументов функции

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

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

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<>. Обновлено, чтобы отразить это.

Ответ 1

public static U[] MakeArray<T, U>(this IEnumerable<T> @enum, Func<T, U> rule)
{
    return @enum.Select(rule).ToArray();
}

Ответ 2

Попробуйте выполнить

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

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

Ответ 3

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

Ответ 5

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

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);