Linq表现:(ElementAt,Count)vs(foreach)

Can*_*hiu 4 c# linq performance

我使用(ElementAt,Count)和(foreach)作为Linq查询的结果迭代IEnumerable.令我惊讶的是,性能差异是25-30倍!这是为什么?

IEnumerable<double> result =
     ... simple Linq query that joins two tables
     ... returns about 600 items

double total = 0;

// Method 1: iterate with Count and ElementAt
for( int i = 0; i < result.Count(); i++ )
{
    total += result.ElementAt(i);
}

// Method 2: iterate with foreach
foreach( double value in result )
{
    total += value;
}
Run Code Online (Sandbox Code Playgroud)

ros*_*dia 10

ElementAt()方法是O(n),除非表示的实际具体类IEnumerable优化它.这意味着每次调用它时,它都必须遍历整个Enumerable以找到元素n.更不用说因为你i < result.Count()for循环的条件部分,它必须每次循环遍历整个枚举以获得该计数.

第二种方式,你只需要循环result一次.


Jod*_*ell 6

因为每次调用它都会ElementAt迭代IEnumerable.IEnumerables未编入索引,因此ElementAt必须使用GetEnumerator().

为什么不呢

total = result.Sum();
Run Code Online (Sandbox Code Playgroud)