System.Collections.Stack.Peek()vs FirstOrDefault()

时间:2015-03-18 17:25:40

标签: c# .net

最近我看到一位同事在与Stack进行交互而不是FirstOrDefault()时使用Peek()

我从未想过使用扩展方法而不是内置的Peek(),我想知道两者之间有什么含义/差异。

推荐的是另一个吗?用ildasm.exe查看并没有教会我任何有用的东西。

2 个答案:

答案 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()也会出错。