1

我可以在一个 foreach 中读取两个链表吗?

我该怎么做?

这是我的代码:

LinkedList<Double> estimatedProxiSize = new LinkedList<Double>();
LinkedList<Double> planAddedAndModifiedSize = new LinkedList<Double>();

estimatedProxiSize.AddLast(Convert.ToDouble(130));
estimatedProxiSize.AddLast(Convert.ToDouble(650));
estimatedProxiSize.AddLast(Convert.ToDouble(99));
estimatedProxiSize.AddLast(Convert.ToDouble(150));
estimatedProxiSize.AddLast(Convert.ToDouble(128));

planAddedAndModifiedSize.AddLast(Convert.ToDouble(163));
planAddedAndModifiedSize.AddLast(Convert.ToDouble(765));
planAddedAndModifiedSize.AddLast(Convert.ToDouble(141));
planAddedAndModifiedSize.AddLast(Convert.ToDouble(166));
planAddedAndModifiedSize.AddLast(Convert.ToDouble(137));

calc(listaX,listaY);

public void calc(LinkedList<Double> listaX, LinkedList<Double> listaY)
{
         //Here, I need something like:
         foreach (var itemx in listaX and var itemy)
         {
                Double xy = itemx*itemxy;
         }
}

可能吗?

或者有更好的方法吗?

4

3 回答 3

1

您可以使用Zip将每个列表中位于相同位置的项目组合成一个对象,然后迭代该结果序列:

var zipped = listaX.Zip(listaY, (x, y)=>new{x,y});

foreach(var pair in zipped)
{
    double product = pair.x * pair.y;
}

或者,为了简化这个特定情况:

var products = listaX.Zip(listaY, (x, y) => x * y);

foreach(double product in products)
{
    //do stuff with product
}
于 2013-09-25T19:06:30.283 回答
1

如果两者LinkedList(T)大小相同,则Enumerable.Zip可以。

否则,您可以自己滚动:

public static class EnumerableExtensions
{
    public static IEnumerable<TResult> Zip<T, TResult>(
        this IEnumerable<T> first,
        IEnumerable<T> second,
        Func<T, T, TResult> resultSelector
    )
    {
        using(var firstEnumerator = first.GetEnumerator())
        using(var secondEnumerator = second.GetEnumerator())
        {
            while(firstEnumerator.MoveNext() && secondEnumerator.MoveNext())
            {
                yield return resultSelector(firstEnumerator.Current,
                                            secondEnumerator.Current);
            }
        }
    }
}

用法:

foreach(var item in listaX.Zip(listaY, (x, y) => x * y)
{
}
于 2013-09-25T19:24:49.337 回答
0

如果estimatedProxiSizeplanAddedAndModifiedSize具有相同数量的元素,您可以使用IEnumrable<T>.Zip

estimatedProxiSize.Zip(planAddedAndModifiedSize,(estim,plan)=> estim * plan));
于 2013-09-25T19:05:32.397 回答