[c#] Différence entre Select et SelectMany


5 Answers

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

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

Sélectionnez plusieurs peuvent être utilisés pour obtenir le jeu suivant

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

Notez que nous prenons ici 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<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 });

le mélange aura les éléments suivants dans la structure plane comme

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

J'ai cherché la différence entre Select et SelectMany mais je n'ai pas été capable de trouver une réponse appropriée. J'ai besoin d'apprendre la différence en utilisant LINQ To SQL mais tout ce que j'ai trouvé sont des exemples de tableaux standard.

Quelqu'un peut-il fournir un exemple LINQ To SQL?




Juste pour une vue alternative qui peut aider certains programmeurs fonctionnels là-bas:

  • Select est la map
  • SelectMany est bind (ou flatMap pour vos flatMap Scala / Kotlin)



C'est la meilleure façon de comprendre je pense.

            var query =
            Enumerable
                .Range(1, 10)
                .SelectMany(ints => Enumerable.Range(1, 10), (a, b) => $"{a} * {b} = {a * b}")
                .ToArray();

        Console.WriteLine(string.Join(Environment.NewLine, query));

        Console.Read();

Exemple de table de multiplication.




SelectMany() vous permet de SelectMany() une séquence multidimensionnelle d'une manière qui nécessiterait sinon une seconde Select() ou une boucle.

Plus de détails sur ce blog .




Certains SelectMany peuvent ne pas être nécessaires. En dessous de 2 requêtes donnent le même résultat.

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

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

Pour une relation 1-à-plusieurs,

  1. Si Start from "1", SelectMany est nécessaire, il aplatit le nombre.
  2. Si Start from "Many", SelectMany n'est pas nécessaire. ( toujours être en mesure de filtrer à partir de "1" , c'est aussi plus simple que sous la requête de jointure standard)
from o in Orders
join c in Customers on o.CustomerID equals c.ID
where c.Name == "Tom"
select o



Je comprends que SelectMany fonctionne comme un raccourci de jointure.

Afin que vous puissiez:

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



Related