阅读链接列表

本文关键字:列表 链接 | 更新日期: 2023-09-27 18:32:44

我可以在一个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;
         }
}

可能吗?

还是有更好的方法

阅读链接列表

如果两个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)
{
}

可以使用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
}

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

estimatedProxiSize.Zip(planAddedAndModifiedSize,(estim,plan)=> estim * plan));