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);