C# 在Where';d系列

C# 在Where';d系列,c#,lambda,iteration,deferred-execution,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); } List processed=

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

我有一个循环

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);
}
List processed=新列表()
foreach(表中的KeyValuePair tbl1,其中(z=>!processed.Contains(z.Key))){
//做些事情……等等
已处理。添加(someInt);
}
我觉得这是非常危险的,但实际上延迟执行会使这一切顺利吗? 它实际上似乎是在重复,我有点温和地说“如预期的那样”,但是。。。。 问题是我猜 这大概是个坏主意,通常情况下,弄乱正在迭代的集合是不好的

想法? 谢谢

我想说清楚。。 问题是

比如说桌子是这样满的

1,没错 2、错误 3,错 4,错 5,错 6,错

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

如果我在第4圈加上6,我会在下一圈得到{5,false}吗? 这也是意料之中的 我想我只是觉得这有点让人困惑,觉得它很危险,但这可能只是对我来说——因为它并不完全有意义


n

当您迭代
表时,它将始终查询
处理的
的当前内容。。。所以它会做你想做的,但我不建议这样做:)

除此之外,您还可以使用
HashSet
避免在每次迭代中进行O(n)包含检查

但是,我怀疑您想要在中使用的功能:

不可否认,这不会给您留下一个已处理密钥的列表。。。但也许这不是问题


就个人而言,我认为LINQ还没有通过
MaxBy
等进行区分是一件很遗憾的事情,但是我们开始了…

对您的表进行分组是否有帮助

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

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

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

不过,这应该行得通

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


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

我认为您直觉认为它不好是正确的:-)但它应该可以工作。
var groups = tables.GroupBy(x=> x.Key);