Ce face SelectMany
Select cu o funcție care întoarce o listă dă o secvență de liste. SelectMany le lipește într-o singură secvență: din clase cu elevi obții toți elevii, din comenzi cu produse obții toate produsele vândute.
A doua formă primește și o funcție care vede atât părintele, cât și elementul copil, ca să le combini (de exemplu numele elevului împreună cu clasa). În sintaxa de interogare, două clauze from la rând se traduc în SelectMany; așa se obține și produsul cartezian a două liste.
Exemple
Exemplul 1: Toți elevii din toate clasele
Clasa[] clase =
[
new("9A", ["Ana", "Mihai"]),
new("9B", ["Ioana"]),
new("9C", []),
];
Console.WriteLine(string.Join(", ", clase.SelectMany(c => c.Elevi)));
Console.WriteLine(string.Join(", ", clase.SelectMany(c => c.Elevi, (c, e) => $"{e} ({c.Nume})")));
record Clasa(string Nume, string[] Elevi);
Rezultat
Ana, Mihai, Ioana
Ana (9A), Mihai (9A), Ioana (9B)
Exemplul 2: Cuvinte unice și combinații
string[] propozitii = ["ana are mere", "mere și pere"];
var cuvinte = propozitii.SelectMany(p => p.Split(' '));
Console.WriteLine(cuvinte.Count());
Console.WriteLine(cuvinte.Distinct().Count());
string[] marimi = ["S", "M"];
string[] culori = ["roșu", "negru"];
var variante = from m in marimi
from c in culori
select $"{m}-{c}";
Console.WriteLine(string.Join(", ", variante));
Rezultat
6
5
S-roșu, S-negru, M-roșu, M-negru
Greșeli frecvente
Select(c => c.Elevi)în loc deSelectMany: rezultatul esteIEnumerable<string[]>, iarstring.JoinafișeazăSystem.String[].- O colecție copil
nullaruncăArgumentNullException; întoarce o colecție goală (c.Elevi ?? []).
Comenzi înrudite
Join: Combină două secvențe după o cheie comună (inner join): fiecare pereche care se potrivește produce un rezultat.GroupJoin și LeftJoin: GroupJoin leagă fiecare element de lista lui de potriviri (poate fi goală); LeftJoin din .NET 10 face direct un left join.Distinct / DistinctBy: Elimină duplicatele dintr-o secvență; DistinctBy compară după o cheie (de exemplu clientul) și păstrează primul element.
Întrebări & Exemple de Cod:
SelectManyAi o nelămurire despre utilizarea comenzii
SelectManysau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.