Comment prendre chacun des deux éléments de IEnumerable comme une paire?
J'ai IEnumerable<string>
qui ressemble {"First", "1", "Second", "2", ... }
.
J'ai besoin de parcourir la liste et de créer IEnumerable<Tuple<string, string>>
où les Tuples ressemblera:
"First", "1"
"Second", "2"
J'ai donc besoin de créer des paires à partir d'une liste que j'ai d'avoir des paires comme mentionné ci-dessus.
Ne pouvez-vous pas simplement effectuer une itération sur elle?
J'aimerais éviter d'écrire des boucles foreach et laid code 😛 Est-il une chance d'obtenir cette aide IEnumberable méthodes?
J'aimerais éviter d'écrire des boucles foreach et laid code 😛 Est-il une chance d'obtenir cette aide IEnumberable méthodes?
OriginalL'auteur Nebojsa Veron | 2011-03-08
Vous devez vous connecter pour publier un commentaire.
Vous pourrait faire quelque chose comme:
Cela vous obtiendrez un
IEnumerable<Tuple<string, string>>
. Il fonctionne par le regroupement des éléments par leur pair/impair positions, puis en élargissant chaque groupe dans unTuple
. L'avantage de cette approche au cours de laZip
approche proposée par BrokenGlass est que il n'énumère que l'original énumérable une fois.Il est cependant difficile pour quelqu'un de comprendre au premier coup d'œil, je voudrais donc soit le faire d'une autre manière (c'est à dire. pas à l'aide de linq), ou un document de son intention à l'endroit où il est utilisé.
OriginalL'auteur adrianbanks
Un paresseux extension de la méthode pour y parvenir est:
Noter que si le nombre d'éléments qui se passe pour ne pas être encore cette va lancer. Un autre moyen serait d'utiliser cette extension de la méthode split de la source, de collecte en morceaux de 2:
Alors vous pouvez faire:
Enfin, utiliser uniquement les méthodes d'extension:
OriginalL'auteur eulerfx
morelinq contient un Lot méthode d'extension qui peut faire ce que vous voulez:
Ouais, que Jon Skeet est très bon 🙂
OriginalL'auteur devdigital
Vous pouvez faire ce travail à l'aide de LINQ
.Zip()
méthode d'extension:Fondamentalement, l'approche est refermé la source Énumérable avec lui-même, en sautant le premier élément, pour la deuxième énumération est un qui va vous donner les paires ("Première, "1"), ("1", "Deuxième"), ("Deuxième", "2").
Puis nous sommes filtrage de l'étrange tuples car nous ne voulons pas que ceux-ci et jusqu'à la fin avec le droit tuple paires ("Premier", 1"), ("Deuxième", "2") et ainsi de suite.
Edit:
J'ai fait d'accord avec le sentiment de la commentaires - c'est ce que je considère être "intelligent" code ressemble à puce, mais il est évident (et pas si évident) inconvénients:
Performance: l'Énumération a pour
parcourir deux fois pour la même
raison, il ne peut pas être utilisé sur
Enumerables
qui consomment leurla source, c'est à dire des données à partir du réseau
les ruisseaux.
Entretien: Il n'est pas évident ce
le code n' - si quelqu'un d'autre
chargé de tenir à jour le code
peut-être des ennuis à venir, surtout
point 1.
Cela dit, je serais probablement utiliser un bon vieux
foreach
boucle de moi-même donné le choix, ou avec une liste comme source de collecte d'unfor
boucle si je peux utiliser l'index directement.Soyez prudent avec cette approche qu'il parcourt la source énumérable plus d'une fois. Cela peut être un problème si la source énumérable ne peut pas être évalué plus d'une fois, ou si elle contient de nombreux éléments.
Juste un avertissement: Cette solution ne pas travail si vous avez seulement accès à la
IEnumerator
, et il peut consommer plus de ressources si faire de nouveauxIEnumerator
s est cher. À utiliser avec prudence si vous l'utilisez sur non conventionnelles types de données.Certes, le rendement n'est pas optimal à l'aide de cette méthode. Je viens de tombé sur MoreLinq donc je vais vérifier aussi. Merci pour les avertissements 🙂
OriginalL'auteur BrokenGlass
Pas que je sache (mais il y a sans doute d'une certaine façon), mais pourrais-je demander "pourquoi"? Je veux dire, quel est si spécial à propos de LINQ?
Je voulais juste savoir si il y a un moyen de le faire.
Haha ok... la curiosité ne fait jamais de mal, je suppose. 🙂
OriginalL'auteur Mehrdad
Si vous êtes en utilisant .NET 4.0, vous pouvez utiliser un tuple de l'objet (voir http://mutelight.org/articles/finally-tuples-in-c-sharp.html). Avec LINQ il devrait vous donner ce dont vous avez besoin. Si non, alors vous avez probablement besoin de définir votre propre tuples de le faire ou encoder ces chaînes, comme par exemple
"First:1"
,"Second:2"
et puis le décoder (également avec LINQ).LINQ ne pouvez pas le faire.
Bien sûr, il PEUT. Par exemple, si votre liste initiale est appelée
input
, puisvar output = from ob in input where inout.IndexOf(ob) % 2 == 1 join eb in input on input.IndexOf(ob) equals input.IndexOf(eb) + 1 select new Tuple<string,string>(eb, ob);
fera l'affaire.OriginalL'auteur freakish