遍历“在哪里”集合
本文关键字:在哪里 集合 遍历 | 更新日期: 2023-09-27 18:32:36
我认为这是一个延迟执行问题,但也许我有点错过了重点
我有一个循环,因此
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} 吗?这又是意料之中的吗我想我只是觉得这有点令人困惑并觉得它很危险,但可能这只适合我 - 因为它并不完全有意义
n
当您遍历tables
时,它将始终查询processed
的当前内容...所以它会做你想做的事,但这不是我建议的方式:)
除此之外,您还可以使用 HashSet<int>
来避免每次迭代时进行 O(n( 包含检查。
但是,我怀疑您希望在 MoreLINQ 中使用 DistinctBy
的功能:
foreach (var item in tables.DistinctBy(x => x.Key))
{
// Process the item
}
诚然,这不会给您留下已处理密钥的列表......但也许这不是问题。
我个人认为 LINQ 还没有 DistinctBy
、MaxBy
等是一种耻辱,但我们开始了......
对表进行分组对您有帮助吗?
var groups = tables.GroupBy(x=> x.Key);
根据您的计划,您可以在内部订购组。还是我弄错了什么?
我认为你的直觉认为这是坏的是正确的:-(
不过它应该可以工作。
where 函数在比较结果时会产生结果,因此每次迭代它都会运行 lambda 并检查键是否在列表中。
您还应该将该列表更改为 HashSet 以提高性能。