【问题标题】:Multiple LINQ Where vs foreach on List<T>List<T> 上的多个 LINQ Where vs foreach
【发布时间】:2012-11-22 14:52:49
【问题描述】:

如果我有收藏:

List<T> collection;

而且我需要对这个集合进行两次测试,这样效率更高:

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
  }
}

我认为会是后者,因为我假设每个 where 都会迭代集合,但只是想确保我没有遗漏什么?

【问题讨论】:

  • 严格来说,迭代的是foreachWhere 只是设置了一个过滤(但非迭代)的包装器。
  • 你也可以使用Any-extension:t.something = collection.Any(w =&gt; w.value);,虽然它只测试其中一个集合...

标签: c# linq foreach


【解决方案1】:

我认为它可能会根据集合大小而改变。但是我会使用第二个代码。

第一个代码将整个集合迭代两次(每个 where 一次),然后对每个结果进行一次迭代。

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

【讨论】:

  • 谈论大约 100-200 条记录。
  • 另请注意,第二个代码要好得多,尤其是在您的数据源是 IEnumerable 的情况下。
  • 没想到,很真实!
【解决方案2】:

第二个很可能会稍微快一些,但差异很小。

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

【讨论】:

  • 我只是设置分隔布尔标志。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2015-11-19
    • 2018-03-09
    • 2023-04-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多