在非更改列表上使用linq查询的开销

时间:2014-05-18 10:29:51

标签: c# linq ienumerable lazy-evaluation

在调试我的代码时,我开始知道如果你使用Linq查询来分配任何属性,那么每当使用该属性时,每次都会执行查询。所以如果你做的事情如下:

 Myprop= MyList.where(p=>p.Stauts=="ABKI BAAR ..");

因此,在您的代码中,无论何时执行foreach(var prop in Myprop)', Myprop.ToList()。count()`或任何使用Myprop,都会导致每次执行linq查询。

每次执行linq查询都不是一个坏主意,特别是当我不修改MyList时?

2 个答案:

答案 0 :(得分:2)

您可以在表达后调用ToList来解决此问题:

Myprop = MyList.where(p=>p.Stauts=="ABKI BAAR ..").ToList(); // or .ToArray()

这样它会立即执行Linq查询,并且每次都不会执行查询,因为现在你有了一个列表。

这显然不会考虑以后对源列表的更改。

答案 1 :(得分:1)

使用.ToArray().ToList()实现查询结果。

所以,而不是

Myprop = MyList.Where(p => p.Status == "ABKI BAAR ..");

使用

Myprop = MyList.Where(p => p.Status == "ABKI BAAR ..").ToArray();

有关ToListToArray

的详细信息,请参阅MSDN文档

你绝对不应该写Myprop.ToList().Count()。这将实现查询(或复制已经实现的结果),计算结果,然后丢弃查询的实现结果(或其副本)。如果您只需要计算,只需Myprop.Count()即可。