Как заставить SelectMany работать без аргументов для универсального IEnumerable <T> - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь создать расширение SelectMany(), которое может работать без какого-либо селектора запросов (поэтому вообще без аргументов).Я придумал следующее:

public static IEnumerable<V> SelectMany<T, V>(this IEnumerable<T> enumerable) where T : IEnumerable<V> {
    return enumerable.SelectMany(e => e);
}

Но аргументы типа не распознаются, когда я пытаюсь назвать его так:

var d = new Dictionary<string, List<decimal>>();
var values = d.Values.SelectMany();

Аргументы типа дляМетод CollectionsExtensions.SelectMany (IEmumerable) не может быть выведен из использования. Попробуйте явно указать аргументы типа.

Он работает только с:

public static IEnumerable<V> SelectMany<K, V>(this Dictionary<K, List<V>>.ValueCollection enumerable) {
    return enumerable.SelectMany(e => e);
}

Чего мне не хватает?

1 Ответ

3 голосов
/ 25 сентября 2019

Метод LINQ SelectMany ожидает функцию селектора, которая обеспечивает IEnumerable<V> от произвольного объекта.

Вы хотите, чтобы ваш SelectMany метод обрабатывал объект IEnumerable<IEnumerable<V>>вместо этого, поэтому нет необходимости указывать функцию селектора.

Так что будьте проще:

static IEnumerable<T> SelectMany<T>(this IEnumerable<IEnumerable<T>> enumerable)
    => enumerable.SelectMany(e => e);
...