1

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

因此我有一个循环

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 圈中我将得到 {5, tbl1 中的 false} 这是预期的吗?

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

n

4

3 回答 3

3

当你迭代tables它时,它总是会查询...的当前内容,processed所以它会做你想做的事,但这不是我建议的方式:)

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

但是,我怀疑您想要MoreLINQDistinctBy中的功能:

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

诚然,这不会给您留下已处理密钥的列表……但也许这不是问题。

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

于 2012-04-30T10:32:26.837 回答
0

将您的表格分组对您有帮助吗?

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

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

于 2012-04-30T10:36:59.753 回答
0

我认为你的直觉认为它很糟糕是正确的:-)

它应该可以工作。

where 函数在比较结果时会产生结果,因此每次迭代都会运行 lambda 并检查键是否在列表中。

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

于 2012-04-30T10:37:17.707 回答