我想知道使用for(或)foreach循环从列表中检索差异,并使用linq查询从列表中检索。特别是在速度和其他差异的情况下
示例:
列表A =新列表()包含10000行我需要复制过滤列表A中的某些行,哪一个更好,以便在速度情况下使用for循环或linq查询
答案 0 :(得分:3)
你可以自己测试并找出答案。 (毕竟,只有您知道运行这些循环和查询的特定情况。)
我的(非常粗略的)经验法则 - 它有许多警告和例外几乎无用 - 是for
循环通常比foreach
略快一些这通常比合理编写的LINQ查询稍快一些。
您应该使用对您的特定情况最有意义的任何构造。如果您想要做的事情最好用for
循环表达,那么就这样做;如果它最好表示为foreach
那么就这样做;如果它最好表达为查询,那么使用LINQ。
只有如果您发现性能不够好,您应该考虑将表达性和正确性的代码重写为速度更快,表达能力更强的代码(但希望仍然正确)。
答案 1 :(得分:2)
如果我们正在谈论常规LINQ,那么我们将重点关注IEnumerable<T>
(LINQ-to-Objects)和IQueryable<T>
(LINQ-to-most-other-stuff)。从IQueryable<T> : IEnumerable<T>
开始,您可以自动使用foreach
- 但意味着非常特定于查询,因为LINQ 通常是懒惰的假脱机来自潜在来源的数据。实际上,这个来源可以是无限的:
public IEnumerable<int> Forever() {
int i = 0;
while(true) yield return i++;
}
...
foreach(int i in Forever()) {
Console.WriteLine(i);
if(Console.ReadLine() == "exit") break;
}
但是,for
循环需要长度和索引器。实际上,通常意味着调用ToList()
或ToArray()
:
var list = source.ToList();
for(int i = 0 ; i < list.Count ; i++) { do something with list[i] }
这在各方面都很有趣:首先,它将为无限序列而死; p 。但是,它也会提前移动假脱机。因此,如果我们 从外部数据源读取,列表上的for
/ foreach
循环会更快,但仅仅因为我们已经将大量工作转移到ToList()
(或ToArray()
等)。
之前执行ToList()
的另一个重要功能是您关闭了阅读器。 可能需要对列表中 内的数据进行操作,并且在阅读器打开时并不总是可行;例如,在枚举时迭代器会中断 - 或者更值得注意的是,除非使用“MARS”,否则SQL Server每个连接只允许一个读取器。作为一个对应点,即“n + 1”,所以也要注意这一点。
在本地列表/数组/ etc上,使用的循环策略很大程度上是冗余的。