C# 多个LINQ,其中vs foreach在列表中

C# 多个LINQ,其中vs foreach在列表中,c#,linq,foreach,C#,Linq,Foreach,如果我有收藏: List<T> collection; 或 我想是晚一点,因为我假设每个where都会迭代集合,但只是想确定我没有遗漏什么?我想它可能会根据集合的大小而改变。然而,我将使用第二个代码 第一个代码对整个集合迭代两次,每个位置迭代一次,然后对每个结果迭代一次 第二个代码只对整个集合迭代一次。而且,它更干净。第一个案例使用WhereEnumerator枚举您的集合两次,以便为您执行检查,第二个案例仅枚举一次,但您必须手动执行检查。后一种情况会更有效,因为您使用简单的条件表

如果我有收藏:

List<T> collection;


我想是晚一点,因为我假设每个where都会迭代集合,但只是想确定我没有遗漏什么?

我想它可能会根据集合的大小而改变。然而,我将使用第二个代码

第一个代码对整个集合迭代两次,每个位置迭代一次,然后对每个结果迭代一次


第二个代码只对整个集合迭代一次。而且,它更干净。

第一个案例使用WhereEnumerator枚举您的集合两次,以便为您执行检查,第二个案例仅枚举一次,但您必须手动执行检查。后一种情况会更有效,因为您使用简单的条件表达式来比较项值,而WhereEnumerator必须对每个项调用提供的委托。

第二种情况很可能会稍微快一点,但差异非常小


可能更重要的是,你以不同的顺序做事。第一个代码首先遍历作用于一个条件的所有项,然后再次作用于另一个条件。第二个代码在项目中循环一次,依次检查每个项目的两个条件。根据您对项目的处理情况,这可能会有所不同。

谈论100-200条记录。还要注意的是,第二个代码要好得多,尤其是在您的数据源是IEnumerable的情况下。没想过,这是真的!严格地说,是foreach进行迭代。Where只设置了一个过滤但非迭代的包装器。您还可以使用Any扩展:t.something=collection.Anyw=>w.value;,虽然只测试其中一个集合…但我只是将其设置为分离布尔标志。
foreach(T t in collection.where(w => w.value == true))
{
     t.something = true;
}

foreach(T t in collection.where(w => w.value2 == true))
{
     t.something2 = true;
}
foreach(T t in collection)
{
 if (t.value == true)
  {
     //check 1
  }

  if (t.value2 == true)
  {
    //check 2
  }
}