Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在C中最优雅地遍历并行集合?_.net_Linq_Collections_C# 3.0_Puzzle - Fatal编程技术网

.net 如何在C中最优雅地遍历并行集合?

.net 如何在C中最优雅地遍历并行集合?,.net,linq,collections,c#-3.0,puzzle,.net,Linq,Collections,C# 3.0,Puzzle,迭代这两个序列以产生一组结果a1、b2、c3的最优雅的方式是什么?这称为压缩或压缩连接两个序列。Eric Lippert并提供了一个实现。强大的Bart de Smet在这里讨论了zip函数: 他最优雅的解决方案利用了select重载,该重载将2参数Func委托作为其参数 var a = new Collection<string> {"a", "b", "c"}; var b = new Collection<int> { 1, 2, 3

迭代这两个序列以产生一组结果a1、b2、c3的最优雅的方式是什么?

这称为压缩或压缩连接两个序列。Eric Lippert并提供了一个实现。

强大的Bart de Smet在这里讨论了zip函数:

他最优雅的解决方案利用了select重载,该重载将2参数Func委托作为其参数

        var a = new Collection<string> {"a", "b", "c"};
        var b = new Collection<int> { 1, 2, 3 };
在本例中,我只是表示正在处理的项的索引。因此,您可以创建这些匿名对象的2个新枚举,并将它们连接到i


就性能而言,我会选择一个更明显的让步循环。

为了补充Eric和Bart的精彩文章,这里有一个使用System的实现。Linq 3.5操作符:

a.Select((t,i)=>new{t,i});

您可以创建迭代器块来优雅地处理此问题:

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);
}
优雅地称之为:

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;
    }
}

我们可以假设两个数组的长度相同吗?如果他们没有,我们会循环使用较短的一个吗?i、 e.a1 b2 c3 d1 e2 f3 g1 h2 i3?这一操作的运行时间非常糟糕,对于本应是线性操作的操作,它实际上是n^2。Eric的博客条目中有一个.NET3.5的Zip实现,符合这一点。这不是最优的,但绝对不是n^2-运行时是线性的,大约是a.Count+b.Count。Join通过索引键构建一个查找表来工作;一旦在线性时间内构建缓存,查找将是O1。如果有什么区别的话,这种方法的主要反对意见是额外的内存成本。大约是,而不是…哦,天哪,你是对的。我不知道这是一个散列匹配,我认为这会导致嵌套循环。很高兴知道!很抱歉造成混淆。不用担心-它会在由from/from/where.Great扩展生成的SelectMany中使用嵌套循环,这正是我所要寻找的。顺便说一句,我添加了第三个方法,ZipToTuple,它变成了var c=a.zip2tuple;
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);
}