Приветствую всех! Кода вы начинаете разбираться в LINQ часто задаетесь вопросами в чем разница между Select и SelectMany. Эти вопросы возникают не только у одного из вас, а у многих. Поэтому я их хочу помочь вам разобраться в этом вопросе.
Select — Создает проекцию части последовательности.
SelectMany — Создает проекцию части последовательности по принципу «один ко многим».
Операция SelectMany объединяет подпоследовательности в единую выходную последовательность. Вспомните, что для каждого входного элемента операция Select выдает в точности один выходной элемент, вошел один и вышел один. В противоположность этому SelectMany который выдает один элемент ко многим, то есть вошел один элемент вышло много либо ноль. В SelectMany элементы берутся из подпоследовательности или дочерней последовательности, которую должно выдавать лямбда-выражение.
Посмотрим что находиться внутри SelectMany:
1 2 3 |
public static IEnumerable<S> SelectMany<T, S>( this IEnumerable<T> source, Func<T, IEnumerable<S>> selector); |
Получаем входную последовательность элементов типа T и делегат метода-селектора, а возвращает объект, который при перечислении проходит по входной последовательности, получая каждый элемент индивидуально из входной последовательности и передавая его в метод-селектор. Последний затем возвращает объект, который во время перечисления выдает ноль или более элементов типа S в промежуточную выходную последовательность. Операция SelectMany вернет конкатенированную выходную последовательность при каждом вызове метода-селектора.
1 2 3 4 5 6 7 8 9 |
string[] words = {"ab", "4пвап54и", "c", "de"}; var letters = words.SelectMany(w => w); foreach(var t in letters) { Console.WriteLine(t); } //a b 4 п в а п 5 4 и с d e |
Таким образом мы получаем из string [] массива строк char [] массив символов.