1341 votes

Différence entre Select et SelectMany

J'ai cherché la différence entre Select et SelectMany mais je n'ai pas pu trouver une réponse adaptée. J'ai besoin de connaître la différence lors de l'utilisation de LINQ To SQL mais tout ce que j'ai trouvé ce sont des exemples de tableau standard.

Est-ce que quelqu'un peut fournir un exemple LINQ To SQL ?

9 votes

Vous pouvez consulter le code pour SelectMany avec une fonction ou avec deux fonctions referencesource.microsoft.com/#System.Core/System/Linq/…

1 votes

Si vous êtes familier avec Kotlin, il a des implémentations assez similaires pour les collections, ainsi que map aka C# Select et flatMap aka C# SelectMany. Fondamentalement, les fonctions d'extension de la bibliothèque std de Kotlin pour les collections ont une similarité avec la bibliothèque C# Linq.

0 votes

Would one agree that SélectionnerParmiPlusieurs would be a much more descriptive name than SélectionnerPlusieurs?

1935voto

Mike Two Points 16706

SelectMany aplatisse les requêtes qui retournent des listes de listes. Par exemple

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

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

IEnumerable people = new List();

// Select obtient une liste de listes de numéros de téléphone
IEnumerable> phoneLists = people.Select(p => p.PhoneNumbers);

// SelectMany l'aplatit pour obtenir juste une liste de numéros de téléphone.
IEnumerable phoneNumbers = people.SelectMany(p => p.PhoneNumbers);

// Et pour inclure des données du parent dans le résultat: 
// passez une expression au deuxième paramètre (resultSelector) dans la surcharge:
var directory = people
   .SelectMany(p => p.PhoneNumbers,
               (parent, child) => new { parent.Name, child.Number });

Démo en direct sur .NET Fiddle

1 votes

Question liée sur l'enchevêtrement de SelectMany pour aplatir une structure hiérarchique imbriquée.

1 votes

Pour mieux comprendre resultSelector, le lien ci-dessous peut vous aider blogs.interknowlogy.com/2008/10/10/…

1 votes

Un autre exemple avec des résultats provenant du parent : dotnetfiddle.net/flcdCC

249voto

Sélectionner plusieurs est comme l'opération de jointure croisée en SQL où il prend le produit croisé.
Par exemple si nous avons

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

Sélectionner plusieurs peut être utilisé pour obtenir l'ensemble suivant

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

Notez qu'ici nous prenons toutes les combinaisons possibles qui peuvent être faites à partir des éléments de l'ensemble A et de l'ensemble B.

Voici un exemple LINQ que vous pouvez essayer

List animaux = new List() { "chat", "chien", "âne" };
List nombres = new List() { 10, 20 };

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

le mix aura les éléments suivants dans une structure plate comme

{(10,chat), (10,chien), (10,âne), (20,chat), (20,chien), (20,âne)}

6 votes

Je sais que c'est vieux, mais je voulais te remercier pour cela, ça m'a beaucoup aidé! :) Il peut être utile d'avoir une référence à ces codes aussi: stackoverflow.com/questions/3479980/… Salut!

7 votes

SelectMany ne doit pas être utilisé de cette manière. Il a également une option pour ne prendre qu'une seule fonction.

11 votes

Je ne sais pas si c'est correct de dire que c'est ainsi que SelectMany est. Plutôt, c'est une façon dont SelectMany peut être utilisé, mais ce n'est pas en réalité la façon normale de l'utiliser.

155voto

AlejandroR Points 1481

entrez la description de l'image ici

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

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

...

16 votes

Excellent exemple de données

7 votes

Est-ce que vous pourriez ajouter un exemple pour select afin de compléter cette réponse :)

0 votes

@Harry : d'un exemple précédent, mais développé un peu : dotnetfiddle.net/Ku6kLR

82voto

Michael Petrotta Points 35647

SelectMany() vous permet de fusionner une séquence multidimensionnelle d'une manière qui nécessiterait autrement un second Select() ou une boucle.

Plus de détails sur ce article de blog.

0 votes

Mais le premier retourne le type Enumérables d'Enfants, le deuxième exemple retourne le type de Parents ? En fait, je suis un peu confus, pourriez-vous éclaircir un peu plus la situation ?

0 votes

Dans l'autre sens en fait. Le deuxième va complètement aplatir la hiérarchie des énumérations, de sorte que vous obtenez les enfants en retour. Essayez l'article du lien que j'ai ajouté, voyez si cela vous aide.

0 votes

Le premier ne semble pas être légal. Je pense que l'afficheur lui-même s'est confondu. Le deuxième retournerait un énumérable de parents.

40voto

roland Points 1433

Il existe plusieurs surcharges de la méthode SelectMany. L'une d'entre elles vous permet de garder une trace de toute relation entre parent et enfants tout en traversant la hiérarchie.

Exemple : supposez que vous ayez la structure suivante : Ligue -> Équipes -> Joueur.

Vous pouvez facilement retourner une collection plate de joueurs. Cependant, vous pouvez perdre toute référence à l'équipe à laquelle le joueur appartient.

Heureusement, il existe une surcharge à cet effet :

var équipesEtLeursLigues = 
         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 
                                  { IDLigue = helper.league.ID
                                    , Équipe = helper.team 
                                   };

L'exemple précédent est tiré du blog d'IK de Dan. Je vous recommande vivement d'y jeter un œil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X