4 votes

Renvoi de plusieurs flux à partir d'une requête LINQ

Je souhaite écrire une requête LINQ qui renvoie deux flux d'objets. En F#, j'écrirais une expression Seq qui créerait un IEnumerable de 2 tuples, puis j'exécuterais Seq.unzip. Quel est le mécanisme approprié pour faire cela en C# (sur .NET 3.5) ?

Merci, Jurgen

3voto

Jon Skeet Points 692016

La meilleure solution consiste probablement à créer un Pair<T1, T2> et renvoie une séquence de ce type. (Ou utiliser un type anonyme pour faire la même chose).

Vous pouvez ensuite le "dézipper" avec :

var firstElements = pairs.Select(pair => pair.First);
var secondElements = pairs.Select(pair => pair.Second);

Cela vaut probablement la peine d'être matérialisé pairs d'abord (par exemple, appeler ToList() à la fin de votre première requête) pour éviter d'évaluer la requête deux fois.

En fait, c'est exactement la même chose que votre approche F#, mais sans support intégré.

2voto

emaster70 Points 3201

En raison de l'absence de tuples en C#, vous pouvez créer un type anonyme. La sémantique de ce type est la suivante :

someEnumerable.Select( inst => new { AnonTypeFirstStream = inst.FieldA, AnonTypeSecondStream = inst.FieldB });

De cette façon, vous n'êtes pas limité dans la quantité de flux que vous renvoyez, vous pouvez simplement ajouter un champ au type anonyme, de la même façon que vous pouvez ajouter un élément à un tuple.

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