LINQ Extension Methods: Zip

Mit der Zip-Erweiterungsmethode können die Elemente zweier Sequenzen 1:1 zusammengeführt werden. Das Ergebnis ist eine neue Sequenz.
Zip ist somit eine spezialisierte Form von Join, wobei der Index als Key verwendet wird. Daher ist es auch egal, wie viele Elemente die jeweiligen Listen haben - zurückgegeben werden nur diejenigen Elemente, die in beiden Listen vorkommen.

Angenommen, man hat die 2 Listen firstNames und lastNamens mit den Vor- bzw. Nachnamen und möchte diese miteinander so kombinieren, dass eine string-Sequenz herauskommt, in der diese Namen durch Komma getrennt zusammengesetzt stehen. Die beiden Listen sind entsprechend sortiert.

Ohne Zip-Methode würde das in etwa so aussehen

1
2
3
4
5
var fullNames = new List<string>();
int count = Math.Min(firstNames.Count, lastNames.Count);
for (int i = 0; i < count; i++) {
fullNames.Add(string.Format("{1}, {0}", firstNames[i], lastNames[i]));
}

wobei die 2. Zeile vereinfacht werden kann, wenn sichergestellt ist, dass die beiden Listen gleich viele Elemente enthalten.

Mit der Zip-Methode geht das wesentlich kürzer (und ist meiner Meinung nach auch etwas leichter lesbar).
Wer noch Probleme mit den Lambda-Ausdrücken hat, der kann sich im Artikel Tanz den => Lambda mit mir... ein wenig einlesen.

1
2
3
4
var fullNames = firstNames.Zip(
lastNames,
(firstName, lastName) => string.Format("{1}, {0}", firstName, lastName)
);

Der Rückgabewert ist nicht auf string-Sequenzen beschränkt. Es kann eine beliebige Klasse (z.B. eine anonymen Klasse) angegeben werden.

Z.B. ist fullNames hier

1
2
3
4
5
6
7
var fullNames = firstNames.Zip(
lastNames,
(firstName, lastName) => new {
FirstName = firstName,
LastName = lastName
}
);

eine Sequenz von Klassen, in denen die Eigenschaften FirstName und LastName gesetzt sind.