Wie nehmen die jeweils zwei Elemente von IEnumerable als paar?
Habe ich IEnumerable<string>
die aussieht wie {"First", "1", "Second", "2", ... }
.
Ich muss die Liste Durchlaufen und erstellen IEnumerable<Tuple<string, string>>
wo Tupel Aussehen wird:
"First", "1"
"Second", "2"
Also ich erstellen müssen Paare aus einer Liste, die ich haben, um Paare, wie oben erwähnt.
Können Sie nicht einfach Durchlaufen?
Ich möchte vermeiden, schreiben foreach-Schleifen und hässlichen code 😛 gibt es eine chance, dies mit IEnumberable Methoden?
Ich möchte vermeiden, schreiben foreach-Schleifen und hässlichen code 😛 gibt es eine chance, dies mit IEnumberable Methoden?
InformationsquelleAutor Nebojsa Veron | 2011-03-08
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du könnte etwas wie:
Diese erhalten Sie eine
IEnumerable<Tuple<string, string>>
. Es funktioniert durch die Gruppierung der Elemente durch Ihre gerade/ungerade Positionen zu erweitern und dann jede Gruppe in eineTuple
. Der Vorteil dieses Ansatzes über dieZip
Ansatz vorgeschlagen, der von BrokenGlass ist, dass es zählt lediglich die original-aufzählbaren einmal.Es ist jedoch schwer für jemanden zu verstehen, auf den ersten Blick, also ich würde entweder machen es auf eine andere Art und Weise (dh. nicht mit linq), oder dokumentieren Sie Ihre Absicht, neben dem es verwendet wird.
InformationsquelleAutor adrianbanks
Einen faulen Erweiterung Methode, dies zu erreichen ist:
Beachten Sie, dass, wenn die Anzahl der Elemente geschieht, um nicht auch diese zu werfen. Ein anderer Weg wäre die Verwendung dieser extensions-Methode split der Quell-Sammlung in chunks von 2:
Dann können Sie tun:
Schließlich verwenden nur bestehende extension Methoden:
InformationsquelleAutor eulerfx
morelinq enthält eine Batch Erweiterung Methode, die Sie tun können, was Sie wollen:
Ja, das Jon Skeet ist ganz gut 🙂
InformationsquelleAutor devdigital
Können Sie diese Arbeit mithilfe der LINQ -
.Zip()
extension Methode:Grundsätzlich der Ansatz ist, flitzen die Quelle Enumerable mit sich selbst, wobei das erste element, also die zweite enumeration ist eine off - geben Sie den Paaren ("Erste, "1"), ("1", "Zweite"), ("Zweiter", "2").
Dann filtern wir die ungerade-Tupel, da wir nicht möchten, dass diese und enden Sie mit der rechten Tupel-Paaren ("First", 1"), ("Zweiter", "2") und so weiter.
Edit:
Ich eigentlich einverstanden mit der Stimmung der Kommentare - das ist, was ich denken würde, "clever" code - sieht smart aus, hat aber offensichtlich (und nicht so offensichtliche) Nachteile:
Leistung: der Durchlaufen werden muss
werden zweimal Durchlaufen - für die gleiche
Grund, es kann nicht verwendet werden
Enumerables
konsumieren IhreQuelle, das heißt, Daten aus dem Netzwerk
streams.
Wartung: Es ist nicht offensichtlich, was
der code tut - wenn jemand anderes ist
die Aufgabe, den code zu pflegen es
könnte ärger geben, vor allem
Punkt 1.
Gesagt, dass ich würde wahrscheinlich mit einem guten alten
foreach
Schleife mich angesichts der Wahl, oder mit einer Liste, die als Quelle der Sammlung einefor
loop-so kann ich mit der index direkt.Seien Sie vorsichtig mit diesem Ansatz, wie es durchläuft die Quelle-enumerable-mehr als einmal. Dies kann ein problem sein, wenn die Quelle Durchlaufen werden kann nicht bewertet werden mehr als einmal oder, wenn es viele Elemente enthält.
Nur eine Warnung: Diese Lösung ist nicht funktionieren, wenn Sie nur Zugang zu den
IEnumerator
, und Sie verbrauchen mehr Ressourcen, wenn neueIEnumerator
s teuer ist. Verwenden Sie mit Vorsicht, wenn Sie es verwenden, auf unkonventionelle Datentypen.Wahr genug, die performance ist nicht optimal mit dieser Methode. Ich habe gerade stieß MoreLinq so werde ich Sie, dass der check out auch. Danke für die Warnung 🙂
InformationsquelleAutor BrokenGlass
Nicht dass ich wüsste (auch wenn es wohl etwas), aber könnte ich Fragen "warum"? Ich meine, was ist so besonderes über LINQ?
Wollte nur wissen, ob es einen Weg gibt, es zu tun.
Haha okay... Neugier schadet nie, denke ich. 🙂
InformationsquelleAutor Mehrdad
Wenn Sie mit .NET 4.0, dann können Sie tuple-Objekt (siehe http://mutelight.org/articles/finally-tuples-in-c-sharp.html). Zusammen mit LINQ-sollte es Sie geben, was Sie brauchen. Wenn nicht, dann müssen Sie wahrscheinlich Ihre eigenen definieren Tupel zu tun, oder codieren Sie diese Zeichenfolgen, wie zum Beispiel
"First:1"
,"Second:2"
und dann entschlüsseln (auch mit LINQ).LINQ kann das nicht tun.
Natürlich KANN es. Zum Beispiel, wenn Ihre erste Liste heißt
input
, dannvar 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);
wird den trick tun.InformationsquelleAutor freakish