Skip to main content
 首页 » 编程设计

c#之在迭代 IEnumerable 时从集合中删除项目

2024年01月22日30me-sa

我有以下代码:

foreach (var bar in dataFromDataFeed.Where(bar => bar.Key < fromTicks 
                                                  || bar.Key > toTicks)) 
{ 
   dataFromDataFeed.Remove(bar.Key); 
} 

这是安全的还是我需要在 foreach 内转换 IEnumerable?到 Dictionary<T,U>第一?

谢谢。

请您参考如下方法:

不,那会炸毁或得到一个仍然有坏元素的结果。只需反转 Where 表达式:

var filtered = dataFromDataFeed.Where(bar => bar.Key >= fromTicks && bar.Key <= toTicks); 
dataFromFeed = filtered.ToList();   // optional 

不清楚你是否真的需要更新列表,通常没有必要,因为你有一个非常好的枚举器,所以最后一个语句是//可选。

请记住,像在原始代码中那样使用 Remove() 具有 O(n*m) 复杂度,非常不好。使用 ToList() 只是 O(m),但需要 O(m) 存储。用速度换取内存是一个常见的程序员决定,但这是一个灌篮高手,除非 m 很大(数亿,你正在与 OOM 作斗争)或非常小。鉴于表达式,两者都不适用。