相关疑难解决方法(0)

LINQ Single vs First

LINQ:

当我确定查询将返回单个记录时,使用Single()运算符是否更有效?First()

有区别吗?

.net linq

202
推荐指数
9
解决办法
9万
查看次数

为什么LINQ .Where(谓词).First()比.First(谓词)快?

我正在做一些性能测试,并注意到一个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)

.net c# linq performance

69
推荐指数
1
解决办法
2万
查看次数

LINQ:将.Single()转换为查询表示法

所以我知道查询符号

var word = from s in stringList
           where s.Length == 3
           select s;
Run Code Online (Sandbox Code Playgroud)

相当于点符号

var word = stringList
           .Where(s => s.Length == 3)
           .Select(s => s);
Run Code Online (Sandbox Code Playgroud)

但是,如何将此点符号转换为查询符号?

var word = wordsList
           .Single(p => p.Id == savedId);
Run Code Online (Sandbox Code Playgroud)

我在Google上找不到太多资源.

c# linq

2
推荐指数
1
解决办法
274
查看次数

标签 统计

linq ×3

.net ×2

c# ×2

performance ×1