[bearbeiten]: zu klären; Dies ist nützlich im generischen LINQ/IEnumerable<T>
Kontext, wo Sie kann nicht verwenden, einen Indexer, weil a: Es existiert nicht in einem Aufzählungszeichen, und b: Sie können nicht garantieren, dass Sie die Daten mehr als lesen können Einmal. Da das OP lambdas erwähnt, kommt es vor, dass LINQ nicht zu weit entfernt ist (und ja, ich weiß, dass LINQ und lambdas nicht ganz dasselbe sind).
Es klingt, als ob Sie den fehlenden Operator Zip
benötigen; Sie können es fälschen:
static void Main()
{
int[] left = { 1, 2, 3, 4, 5 };
string[] right = { "abc", "def", "ghi", "jkl", "mno" };
// using KeyValuePair<,> approach
foreach (var item in left.Zip(right))
{
Console.WriteLine("{0}/{1}", item.Key, item.Value);
}
// using projection approach
foreach (string item in left.Zip(right,
(x,y) => string.Format("{0}/{1}", x, y)))
{
Console.WriteLine(item);
}
}
// library code; written once and stuffed away in a util assembly...
// returns each pais as a KeyValuePair<,>
static IEnumerable<KeyValuePair<TLeft,TRight>> Zip<TLeft, TRight>(
this IEnumerable<TLeft> left, IEnumerable<TRight> right)
{
return Zip(left, right, (x, y) => new KeyValuePair<TLeft, TRight>(x, y));
}
// accepts a projection from the caller for each pair
static IEnumerable<TResult> Zip<TLeft, TRight, TResult>(
this IEnumerable<TLeft> left, IEnumerable<TRight> right,
Func<TLeft, TRight, TResult> selector)
{
using(IEnumerator<TLeft> leftE = left.GetEnumerator())
using (IEnumerator<TRight> rightE = right.GetEnumerator())
{
while (leftE.MoveNext() && rightE.MoveNext())
{
yield return selector(leftE.Current, rightE.Current);
}
}
}
Möchten Sie die entsprechenden Elemente jeder Liste verketten? Oder willst du das kartesische Produkt der Listen? –
@Vincent: Da er die gleiche Länge erwähnt, rate ich die erste. –
Weder. Aber das sollte nicht wichtig sein, oder? – Graviton