最近我看到一位同事在与Stack进行交互而不是FirstOrDefault()
时使用Peek()
。
我从未想过使用扩展方法而不是内置的Peek()
,我想知道两者之间有什么含义/差异。
推荐的是另一个吗?用ildasm.exe查看并没有教会我任何有用的东西。
答案 0 :(得分:8)
FirstOrDefault
将返回T
的默认值; Peek
会抛出。
就功能变化而言,这是关于它的。 FirstOrDefault
添加了几层间接,创建了一个可枚举/枚举对象(最终需要处理),计算是否有更多项,通过可枚举获取第一个项,然后返回它,而不是比堆栈本身只做必要的操作。虽然这在技术上更加有效,但在绝大多数情况下,这种情况极不可能发生。
答案 1 :(得分:2)
引用MSDn https://msdn.microsoft.com/en-us/library/system.collections.stack.peek%28v=vs.110%29.aspx
首先
Peek()是O(1)操作
FirstOrDefault()根据Reflector的工作方式如下,操作起来比较昂贵。
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
if (list.Count > 0)
{
return list[0];
}
}
else
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
return enumerator.Current;
}
}
}
return default(TSource);
}
其次,
在空堆栈中查看错误,FirstOrDefault返回空值,尽管First()也会出错。