我正在做一些性能测试,并注意到一个LINQ表达式
result = list.First(f => f.Id == i).Property
Run Code Online (Sandbox Code Playgroud)
比...慢
result = list.Where(f => f.Id == i).First().Property
Run Code Online (Sandbox Code Playgroud)
这似乎反直觉.我原以为第一个表达式会更快,因为它可以在谓词满足后立即停止遍历列表,而我会认为.Where()表达式可能会在调用.First()结果子集之前迭代整个列表.即使后者发生短路,它也不应该比直接使用First更快,但它确实如此.
下面是两个非常简单的单元测试来说明这一点.当在TestWhereAndFirst上进行优化编译时,比.Net和Silverlight 4上的TestFirstOnly快30%.我尝试使谓词返回更多结果,但性能差异是相同的.
任何人都可以解释为什么.First(fn)慢于.Where(fn).First()?我看到一个类似的反直觉结果与之.Count(fn)相比.Where(fn).Count().
private const int Range = 50000;
private class Simple
{
public int Id { get; set; }
public int Value { get; set; }
}
[TestMethod()]
public void TestFirstOnly()
{
List<Simple> list = new List<Simple>(Range);
for (int i = Range - 1; i >= 0; --i)
{
list.Add(new …Run Code Online (Sandbox Code Playgroud) 我有一个表达式让我回头:
var UserNotificationIds = _notificationBidderRepos.All(u => u.BidderId == BidderId).Select(n =>n.BidderId);
Run Code Online (Sandbox Code Playgroud)
另一种结构具有通知和要求是过滤其中提供了Id的通知 UserNotificationIds
var AllNotifications = _notificationRepos.All(n => n.ExpiresAt > DateTime.UtcNow).ToList();
Run Code Online (Sandbox Code Playgroud)
我正在尝试以下代码来查询所有通知,但没有得到如何在我的表达式中强制"where in".
请帮忙