在LINQ中如何评估SingleOrDefault()方法?它在幕后使用二进制搜索吗?LINQ如何实现SingleOrDefault()方法?
2
A
回答
12
比试图用文字解释更好,我想我只是在.NET Framework中发布实现的确切代码,使用Reflector程序检索(并重新格式化)。
public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
throw Error.ArgumentNull("source");
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
switch (list.Count)
{
case 0:
return default(TSource);
case 1:
return list[0];
}
}
else
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (!enumerator.MoveNext())
return default(TSource);
TSource current = enumerator.Current;
if (!enumerator.MoveNext())
return current;
}
}
throw Error.MoreThanOneElement();
}
这是相当有趣的oberserve,如果对象是IList<T>
类型,它看起来非常明智的优化而成。它简单地回退到枚举对象,否则如果对象实现的任何东西都不比IEnumerable<T>
更具体,并且这样做只是你的期望。
请注意,它不能使用二分查找,因为该对象不一定表示已排序的集合。 (实际上,在几乎所有使用情况下,都不会)。
0
我不认为它做了任何搜索,它都是关于获取源[list,result set等]的第一个元素。
我最好的猜测是它只是拉第一个元素。如果没有第一个,它将返回默认值(null,0,false等)。如果有第一个,它试图拉第二个结果。如果有第二个结果,则会引发异常。否则它返回第一个结果。
2
我假设它只是执行查询,如果结果计数为零,它将返回该类的默认实例。如果结果数为1,则返回该实例,如果结果数大于1,则会引发异常。
相关问题
- 1. Linq to Entities不支持方法'SingleOrDefault'
- 2. .Single(),.SingleOrDefault()方法的实际用法
- 3. LINQ的SingleOrDefault
- 4. LINQ方法语法 - 如何实现动态的LINQ语句
- 5. Linq到NHibernate - 方法Cos没有实现
- 6. c#系统方法&& LINQ实现
- 7. 如何实现can()方法?
- 8. 如何实现containsAll方法
- 9. 如何实现GestureListener.onFling()方法
- 10. 如何为LINQ to SQL的OnValidate方法提供默认实现?
- 11. Linq如何实现它?
- 12. Linq,是select()。SingleorDefault()是一个坏主意?
- 13. 为什么LINQ to Entities不支持SingleOrDefault()?
- 14. 如何从一次到多次使用LINQ获取SingleOrDefault值?
- 15. LINQ与AddMonth方法实体
- 16. JavaScript核心方法如何实现?
- 17. 如何实现鼠标悬停方法?
- 18. java:如何实现StringBuilder的replaceAll方法
- 19. 如何实现hashCode和equals方法
- 20. 如何实现钻石平方算法?
- 21. 如何实现方法覆盖接口
- 22. 如何在ImageView上实现onClick()方法
- 23. 如何使用MVVM方法实现DataGrid
- 24. 如何返回实现从方法
- 25. 如何在IBAction中实现NSArray方法?
- 26. 如何为'ServiceStack.Razor.RazorFormat'实现'RenderPartial'方法?
- 27. 如何在VB.NET中实现GetStableHash方法
- 28. 如何使用futex实现此方法?
- 29. 如何实现平等方法?
- 30. 如何实现ContentProvider的getParent方法