SelectMany în C# (.NET)

Aplatizează colecții imbricate: din fiecare element ia o colecție și le lipește pe toate într-o singură secvență.

Sintaxă C#
sursa.SelectMany(x => x.Colectie)   sursa.SelectMany(x => x.Colectie, (x, copil) => ...)

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 de SelectMany: rezultatul este IEnumerable<string[]>, iar string.Join afișează System.String[].
  • O colecție copil null aruncă 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.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: SelectMany

Ai o nelămurire despre utilizarea comenzii SelectMany sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.