1361 Stimmen

Unterschied zwischen Select und SelectMany

Ich habe nach dem Unterschied zwischen Select y SelectMany aber ich habe keine passende Antwort gefunden. Ich muss den Unterschied bei der Verwendung von LINQ To SQL lernen, aber alles, was ich gefunden habe, sind Standard-Array-Beispiele.

Kann jemand ein LINQ To SQL-Beispiel zur Verfügung stellen?

9 Stimmen

Sie können sich den Code für SelectMany mit einer Funktion oder mit zwei Funktionen ansehen referencesource.microsoft.com/#System.Core/System/Linq/

1 Stimmen

Wenn Sie mit Kotlin vertraut sind, hat es ganz ähnliche Implementierungen für Sammlungen wie map aka C# Select und flatMap aka C# SelectMany. Grundsätzlich Kotlin std Bibliothek Erweiterung Funktionen für Sammlungen hat Ähnlichkeit mit C # Linq Bibliothek.

0 Stimmen

Würde man zustimmen, dass SelectFromMany wäre ein viel beschreibenderer Name als SelectMany ?

26voto

Nathan Koop Punkte 23863

Ich verstehe SelectMany wie eine Verknüpfung funktionieren soll.

Das können Sie:

var orders = customers
             .Where(c => c.CustomerName == "Acme")
             .SelectMany(c => c.Orders);

4 Stimmen

Das angegebene Beispiel funktioniert, aber SelectMany funktioniert nicht gerade wie eine Verknüpfung. Bei einer Verknüpfung kann jedes Feld der Originaltabelle und jedes Feld der verknüpften Tabelle "verwendet" werden. Hier müssen Sie jedoch ein Objekt einer Liste angeben, die an die Originaltabelle angehängt ist. Zum Beispiel, .SelectMany(c => new {c.CompanyName, c.Orders.ShippedDate}); würde nicht funktionieren. Mit SelectMany wird die Liste der Listen eher geglättet - und Sie können für das Ergebnis eine beliebige (aber immer nur eine) der enthaltenen Listen auswählen. Zum Vergleich: Innere Verknüpfung in Linq .

26voto

Reza Jenabi Punkte 3356

El SelectMany() Methode wird verwendet, um abflachen. eine Sequenz, bei der jedes Element der Sequenz ein separates ist.

Ich habe Klasse user genauso wie diese

class User
    {
        public string UserName { get; set; }
        public List<string> Roles { get; set; }
    }

Haupt:

var users = new List<User>
            {
                new User { UserName = "Reza" , Roles = new List<string>{"Superadmin" } },
                new User { UserName = "Amin" , Roles = new List<string>{"Guest","Reseption" } },
                new User { UserName = "Nima" , Roles = new List<string>{"Nurse","Guest" } },
            };

var query = users.SelectMany(user => user.Roles, (user, role) => new { user.UserName, role });

foreach (var obj in query)
{
    Console.WriteLine(obj);
}
//output

//{ UserName = Reza, role = Superadmin }
//{ UserName = Amin, role = Guest }
//{ UserName = Amin, role = Reseption }
//{ UserName = Nima, role = Nurse }
//{ UserName = Nima, role = Guest }

Sie können Operationen auf jedes Element der Sequenz anwenden

int[][] numbers = {
                new[] {1, 2, 3},
                new[] {4},
                new[] {5, 6 , 6 , 2 , 7, 8},
                new[] {12, 14}
            };

IEnumerable<int> result = numbers
                .SelectMany(array => array.Distinct())
                .OrderBy(x => x);

//output

//{ 1, 2 , 2 , 3, 4, 5, 6, 7, 8, 12, 14 }

 List<List<int>> numbers = new List<List<int>> {
                new List<int> {1, 2, 3},
                new List<int> {12},
                new List<int> {5, 6, 5, 7},
                new List<int> {10, 10, 10, 12}
            };

 IEnumerable<int> result = numbers
                .SelectMany(list => list)
                .Distinct()
                .OrderBy(x=>x);

//output

// { 1, 2, 3, 5, 6, 7, 10, 12 }

0 Stimmen

Was ist, wenn eine oder mehrere der Listen ungültig sind? Können Sie die anderen trotzdem aggregieren? Ich erhalte eine Fehlermeldung, weil ich einige Null-Ergebnisse habe.

13voto

Alexandr Punkte 4942

Select ist eine einfache Eins-zu-Eins-Projektion vom Quellelement auf ein Ergebniselement. Auswählen- Many wird verwendet, wenn ein Abfrageausdruck mehrere from-Klauseln enthält: Jedes Element der ursprünglichen Sequenz wird verwendet, um eine neue Sequenz zu erzeugen.

9voto

nzrytmn Punkte 4812

Die formale Beschreibung für SelectMany() lautet:

Projiziert jedes Element einer Sequenz in ein IEnumerable und reduziert es die resultierenden Sequenzen in eine Sequenz.

SelectMany() fasst die resultierenden Sequenzen zu einer einzigen Sequenz zusammen und ruft für jedes Element darin eine Ergebnisauswahlfunktion auf.

class PetOwner
{
    public string Name { get; set; }
    public List<String> Pets { get; set; }
}

public static void SelectManyEx()
{
     PetOwner[] petOwners =
         { new PetOwner { Name="Higa, Sidney",
              Pets = new List<string>{ "Scruffy", "Sam" } },
           new PetOwner { Name="Ashkenazi, Ronen",
              Pets = new List<string>{ "Walker", "Sugar" } },
           new PetOwner { Name="Price, Vernette",
              Pets = new List<string>{ "Scratches", "Diesel" } } };

// Query using SelectMany().
IEnumerable<string> query1 = petOwners.SelectMany(petOwner => petOwner.Pets);

Console.WriteLine("Using SelectMany():");

// Only one foreach loop is required to iterate
// through the results since it is a
// one-dimensional collection.
foreach (string pet in query1)
{
    Console.WriteLine(pet);
}

// This code shows how to use Select()
// instead of SelectMany().
IEnumerable<List<String>> query2 =
    petOwners.Select(petOwner => petOwner.Pets);

Console.WriteLine("\nUsing Select():");

// Notice that two foreach loops are required to
// iterate through the results
// because the query returns a collection of arrays.
foreach (List<String> petList in query2)
{
    foreach (string pet in petList)
    {
        Console.WriteLine(pet);
    }
    Console.WriteLine();
}
}

/*
   This code produces the following output:

    Using SelectMany():
    Scruffy
    Sam
    Walker
    Sugar
    Scratches
    Diesel

   Using Select():
   Scruffy
   Sam

   Walker
   Sugar

   Scratches
   Diesel
  */

Der Hauptunterschied ist das Ergebnis jeder Methode, während SelectMany() ein flaches Ergebnis zurückgibt; Select() gibt eine Liste von Listen statt einer flachen Ergebnismenge zurück.

Daher ist das Ergebnis von SelectMany eine Liste wie

{Scruffy, Sam , Walker, Sugar, Scratches , Diesel}

mit dem Sie jedes Element mit nur einem foreach durchlaufen können. Aber mit dem Ergebnis von select benötigen Sie eine zusätzliche foreach-Schleife, um die Ergebnisse zu durchlaufen, da die Abfrage eine Sammlung von Arrays zurückgibt.

9voto

Rm558 Punkte 3759

Einige SelectMany sind möglicherweise nicht erforderlich. Die folgenden 2 Abfragen liefern das gleiche Ergebnis.

Customers.Where(c=>c.Name=="Tom").SelectMany(c=>c.Orders)

Orders.Where(o=>o.Customer.Name=="Tom")

Für 1-zu-Viel-Beziehungen,

  1. wenn Start von "1", SelectMany benötigt wird, werden die vielen flach gemacht.
  2. wenn Start von "Viele", SelectMany ist nicht erforderlich. ( immer noch ab "1" filtern können (auch dies ist einfacher als die unten stehende Standardabfrage zur Verknüpfung)

from o in Orders
join c in Customers on o.CustomerID equals c.ID
where c.Name == "Tom"
select o

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X