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 ?

1961voto

Mike Two Punkte 42868

SelectMany glättet Abfragen, die Listen von Listen zurückgeben. Zum Beispiel

public class PhoneNumber
{
    public string Number { get; set; }
}

public class Person
{
    public IEnumerable<PhoneNumber> PhoneNumbers { get; set; }
    public string Name { get; set; }
}

IEnumerable<Person> people = new List<Person>();

// Select gets a list of lists of phone numbers
IEnumerable<IEnumerable<PhoneNumber>> phoneLists = people.Select(p => p.PhoneNumbers);

// SelectMany flattens it to just a list of phone numbers.
IEnumerable<PhoneNumber> phoneNumbers = people.SelectMany(p => p.PhoneNumbers);

// And to include data from the parent in the result: 
// pass an expression to the second parameter (resultSelector) in the overload:
var directory = people
   .SelectMany(p => p.PhoneNumbers,
               (parent, child) => new { parent.Name, child.Number });

Live-Demo auf .NET Fiddle

1 Stimmen

Verwandte Frage bei der Verschachtelung von SelectMany, um eine verschachtelte hierarchische Struktur zu glätten.

2 Stimmen

Um resultSelector besser zu verstehen, hilft der folgende Link blogs.interknowlogy.com/2008/10/10/

1 Stimmen

Eine weitere Demo mit Ergebnissen von Eltern: dotnetfiddle.net/flcdCC

255voto

Viele auswählen ist wie Cross-Join-Operation in SQL wobei es das Kreuzprodukt nimmt.
Wenn wir zum Beispiel Folgendes haben

Set A={a,b,c}
Set B={x,y}

Select many kann verwendet werden, um den folgenden Satz zu erhalten

{ (x,a) , (x,b) , (x,c) , (y,a) , (y,b) , (y,c) }

Man beachte, dass wir hier alle möglichen Kombinationen aus den Elementen der Menge A und der Menge B nehmen.

Hier ist ein LINQ-Beispiel, das Sie ausprobieren können

List<string> animals = new List<string>() { "cat", "dog", "donkey" };
List<int> number = new List<int>() { 10, 20 };

var mix = number.SelectMany(num => animals, (n, a) => new { n, a });

der Mix wird folgende Elemente in flacher Struktur enthalten wie

{(10,cat), (10,dog), (10,donkey), (20,cat), (20,dog), (20,donkey)}

7 Stimmen

Ich weiß, dies ist alt, aber ich wollte mich bei Ihnen dafür bedanken, es hat mir eine Menge erspart! :) Es kann auch nützlich sein, einen Verweis auf diese Codes zu haben: stackoverflow.com/questions/3479980/ Zum Wohl!

7 Stimmen

SelectMany muss nicht auf diese Weise verwendet werden. Es gibt auch die Möglichkeit, nur eine Funktion zu nehmen.

11 Stimmen

Ich weiß nicht, ob es richtig ist, zu sagen, dass dies die Art und Weise ist SelectMany est . Vielmehr ist dies ein Weg, der SelectMany kann verwendet werden, ist aber eigentlich nicht die übliche Art der Verwendung.

155voto

AlejandroR Punkte 4943

enter image description here

var players = db.SoccerTeams.Where(c => c.Country == "Spain")
                            .SelectMany(c => c.players);

foreach(var player in players)
{
    Console.WriteLine(player.LastName);
}
  1. De Gea
  2. Alba
  3. Costa
  4. Villa
  5. Busquets

...

22 Stimmen

Tolle Beispieldaten

8 Stimmen

Könnten Sie ein Beispiel für Select hinzufügen, um diese Antwort zu vervollständigen :)

0 Stimmen

@Harry: aus einer früheren Probe, aber ein bisschen weiterentwickelt: dotnetfiddle.net/Ku6kLR

83voto

Michael Petrotta Punkte 58361

SelectMany() können Sie eine mehrdimensionale Sequenz auf eine Art und Weise kollabieren, die sonst eine zweite Select() oder Schleife.

Weitere Einzelheiten finden Sie hier Blog-Beitrag .

0 Stimmen

Aber das erste Beispiel gibt den Enumerables-Typ von Children zurück, das zweite Beispiel den Typ von Parents? Eigentlich bin ich ein wenig verwirrt, würden Sie es ein wenig mehr öffnen?

0 Stimmen

Eigentlich ist es genau andersherum. Im zweiten Fall wird die Hierarchie der Aufzählungszeichen vollständig abgeflacht, so dass Sie Kinder zurückbekommen. Versuchen Sie den Artikel unter dem Link, den ich hinzugefügt habe, um zu sehen, ob das hilft.

0 Stimmen

Die erste scheint nicht legal zu sein. Ich glaube, der Poster hat sich selbst verwirrt. Die zweite würde eine Aufzählung der Eltern zurückgeben.

40voto

roland Punkte 7345

Es gibt mehrere Überlastungen zu SelectMany . Eine davon ermöglicht es Ihnen, jede Beziehung zwischen Eltern und Kindern zu verfolgen, während Sie die Hierarchie durchlaufen.

Ejemplo : Nehmen wir an, Sie haben die folgende Struktur: League -> Teams -> Player .

Sie können problemlos eine flache Sammlung von Spielern zurückgeben. Es kann jedoch sein, dass Sie den Hinweis auf die Mannschaft, zu der der Spieler gehört, verlieren.

Glücklicherweise gibt es für solche Zwecke eine Überlastung:

var teamsAndTheirLeagues = 
         from helper in leagues.SelectMany
               ( l => l.Teams
                 , ( league, team ) => new { league, team } )
                      where helper.team.Players.Count > 2 
                           && helper.league.Teams.Count < 10
                           select new 
                                  { LeagueID = helper.league.ID
                                    , Team = helper.team 
                                   };

Das vorherige Beispiel stammt aus Dans IK-Blog . Ich empfehle Ihnen dringend, einen Blick darauf zu werfen.

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