迭代Where'd集合

时间:2012-04-30 10:29:35

标签: c# lambda iteration deferred-execution

我认为这是一个延迟执行的问题,但也许我错过了一点点

我有一个循环

List<int> processed = new List<int>()
foreach(KeyValuePair<int,bool> tbl1 in tables.Where(z=>!processed.Contains(z.Key))){
   //do some stuff...etc 
   processed.Add(someInt);
}

我觉得这很危险,但实际上延迟执行是否有效? 它实际上似乎是迭代我有点温和地说'如预期'但.... 问题是我猜 大概这是一个坏主意,通常搞乱你正在迭代的集合是坏事。

想法? 感谢

好的,要明确.. 问题是

表示表格就像这样填充

1时,真 2,假 3,假 4,假 5,假的 如图6所示,假

第一圈我在tbl1中获得{1,true}并将2添加到已处理列表中 在第二圈,我会在tbl1中获得{3,false} 然后将3和4加入处理中 第3圈我会在tbl1得到{5,false} 这是预期的吗?

如果我在第4圈加6加工,我会在下一次再次获得{5,false}吗? 这是预期的 我想我觉得这有点令人困惑,感觉很危险,但这可能只适合我 - 因为它不完全有意义

名词

3 个答案:

答案 0 :(得分:3)

当您遍历tables时,它将始终查询processed当前内容......所以它会做你想要的,但这不是我的方式建议这样做:)

除了其他任何内容之外,您可以使用HashSet<int>来避免每次迭代都进行O(n)包含检查。

但是,我怀疑您需要DistinctByMoreLINQ的功能:

foreach (var item in tables.DistinctBy(x => x.Key))
{
    // Process the item
}

这不会给你留下处理过的密钥列表,诚然......但也许这不是问题。

就我个人而言,我认为LINQ还没有DistinctByMaxBy等,这是一种耻辱,但我们去了......

答案 1 :(得分:0)

对表格进行分组会对您有所帮助吗?

var groups = tables.GroupBy(x=> x.Key);

根据您的计划,您可以在内部订购这些组。还是我弄错了?

答案 2 :(得分:0)

我认为你的直觉是坏的是正确的:-)

它应该工作。

where函数在比较它们时产生结果,因此每次迭代它将运行lambda并检查密钥是否在列表中。

您还应该将该列表更改为HashSet以提高性能。