LINQ foreach在列表创建期间

时间:2011-02-17 21:17:47

标签: linq list foreach

我有一个简单的LINQ语句,它构建了一个大约80亿个项目的庞大怪物列表。然后循环每个项目并对该项目执行操作。问题是,在完全创建列表之前,foreach甚至不会运行。是否可以使用LINQ并让它为每个项目执行foreach,因为它构建它而不是等待?

我没有在列表中做任何事情,比如排序。只是直接建立列表。

编辑:这可能看起来很奇怪,但我有一些数据库行有几个数值。我知道这些值的一些算术组合产生了我想要的数字,但我不确定是哪一个。因此我创建了以下LINQ:

(
 from I1 in Items
 from I2 in Items
 from I3 in Items
 from I4 in Items
 select new Item[] { I1, I2, I3, I4 }
).ToList().ForEach(x => CalculateValues(x);

我为1个项目做了上述声明,然后是2个项目,依此类推。我的电脑在3件物品上悬挂了一段时间,约有2800万件物品。

我知道这是效率低下的,但我打算做一个快速的程序来过夜。

2 个答案:

答案 0 :(得分:4)

在构建列表时,如果可能的话,您希望使用yield,这样您就不会有80亿个项目。

e.g。

public IEnumerable<MyItem> ListBuilder()
{
   while (stillBuilding)
   {
       yield return currentItem;
   }
}

然后预测结果。

如果你想要并发/多线程的东西,那么它就会更复杂,你应该有一个线程构建项目并将它们提供给一个队列,一个或多个消费者线程将项目从队列中拉出来并执行操作。

答案 1 :(得分:1)

不要调用ToList()该方法会尝试将整个数据加载到内存中

试试这个,

var q = from I1 in Items
        from I2 in Items
        from I3 in Items
        from I4 in Items
        select new Item[] { I1, I2, I3, I4 };

foreach(var x in q)
{
    CalculateValues(x);
}

对于您的输入可能仍然很慢,但如果我是正确的话,它会流式传输结果并一次处理一次。