CRe中的.RemoveAll和.Where之间的性能差异

Joh*_*nes 1 c# linq performance

我有一个项目列表,我想迭代它们的一个子集.现在,我想知道从列表中删除不需要的项目然后循环它之间是否存在性能影响差异; 或者只是过滤for循环中的列表.

这是一个例子.

RemoveAll方法:

list.RemoveAll(o => !someOtherList.Contains(o.Property));

foreach (var i in list)
{
}
Run Code Online (Sandbox Code Playgroud)

Where方法:

foreach (var i in list.Where(o => someOtherList.Contains(o.Property))
{
}
Run Code Online (Sandbox Code Playgroud)

我知道第一种方法实际上是要操纵列表中的内容,而第二种方法则不会.这并不关心我.我更关心的是第二种方法中的过滤器是否适用于每次迭代,或者C#是否足够智能以创建子集并且仅循环通过该子集(几乎与第一种方法一起使用临时变量).

Zei*_*kki 5

我更关心的是第二种方法中的过滤器是否适用于每次迭代,或者C#是否足够智能以创建子集并且仅循环通过该子集(几乎与第一种方法一起使用临时变量)

Linq Where使用yield,以便在请求时一次返回一个元素.

所以实际上在第二种方法中所做的是:

1-遍历列表

2-检查Current元素是否与条件匹配(通过someOtherList循环,除非它是特殊的查找数据结构,例如.HashSet)

3-一旦我们发现第一个元素返回它

4-执行foreach体逻辑

5-继续搜索我们在第3步停止的位置

这意味着如果您决定基于foreach块内的某些条件而中断,则可能不会在该点扫描所有列表,这在某些情况下可能会在大型列表上提升性能.