阅读链接列表

时间:2013-09-25 19:02:21

标签: c# foreach

我可以在一个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 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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)
{
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

   //Here, I need something like:
   foreach (var itemx in listaX and var itemy)
   {
       Double xy = itemx*itemxy;
   }

这听起来像是一个完整的笛卡尔积,即numItems = listAx.Count * listaY.Count。

您需要2个循环:

   foreach (var itemx in listaX)
   {
     foreach (var itemy in listaY)
     {
         Double xy = itemx*itemxy;
         ... // use it
     }
   }