var a = new Collection<string> {"a", "b", "c"};
var b = new Collection<int> { 1, 2, 3 };
迭代两者产生一组结果“a1”,“b2”,“c3”的最优雅方法是什么?
答案 0 :(得分:13)
这被称为“压缩”或“拉链连接”两个序列。 Eric Lippert describes this very algorithm并提供了一个实现。
答案 1 :(得分:4)
强大的Bart de Smet在这里讨论了zip功能:
他最优雅的解决方案利用了select的重载,它以2参数Func委托作为参数。
a.Select((t,i)=>new{t,i});
在此示例中,我只是表示正在处理的项目的索引。因此,您可以创建这些匿名对象的2个新枚举,并在i上加入它们。
在性能方面,我会选择一个更明显的屈服循环。
答案 2 :(得分:3)
为了补充Eric和Bart的精彩帖子,这是使用System.Linq 3.5运算符的实现:
public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult> (
this IEnumerable<TFirst> first,
IEnumerable<TSecond> second,
Func<TFirst, TSecond, TResult> resultSelector)
{
return from aa in a.Select((x, i) => new { x, i })
join bb in b.Select((y, j) => new { y, j })
on aa.i equals bb.j
select resultSelector(aa.x, bb.y);
}
答案 3 :(得分:1)
您可以创建一个迭代器块来优雅地处理它:
public static class Ext
{
public static IEnumerable<string> ConcatEach(this IEnumerable a,
IEnumerable b)
{
var aItor = a.GetEnumerator();
var bItor = b.GetEnumerator();
while (aItor.MoveNext() && bItor.MoveNext())
yield return aItor.Current.ToString() + bItor.Current;
}
}
优雅地称呼=)as:
var a = new Collection<string> {"a", "b", "c"};
var b = new Collection<int> {1, 2, 3};
foreach(var joined in a.ConcatEach(b))
{
Console.WriteLine(joined);
}