我很好奇如何 SingleOrFallback 方法实施于 更多Linq 并发现了一些我以前从未见过的东西:

    public static T SingleOrFallback<T>(this IEnumerable<T> source, Func<T> fallback)
    {
        source.ThrowIfNull("source");
        fallback.ThrowIfNull("fallback");
        using (IEnumerator<T> iterator = source.GetEnumerator())
        {
            if (!iterator.MoveNext())
            {
                return fallback();
            }
            T first = iterator.Current;
            if (iterator.MoveNext())
            {
                throw new InvalidOperationException();
            }
            return first;
        }
    }

为什么是 IEnumerator<T> 在一个 using 陈述?这是使用时应该考虑的问题吗? foreach 在一个 IEnumerable<T> 还?

附带问题: 这个方法到底做了什么?当源序列不恰好包含一项时,它是否会返回后备项?

有帮助吗?

解决方案

IEnumerator<T> 延伸 IDisposable, , 那么你 应该 将其放在 using 语句中。 foreach 自动执行此操作。(非泛型 IEnumerator 延长 IDisposable 但C#编译器仍然生成代码来调用 Dispose 有条件的。这是 C# 1.0 和 1.2 之间的(少数)更改之一,由于某种原因,其中 1.2 是随 .NET 1.1 一起发布的版本。)

这是一篇文章 解释为什么这在迭代器块的上下文中很重要。

至于该方法的作用:

  • 如果序列为空,则返回后备项
  • 如果序列只有一项,则返回它
  • 如果序列有多于一项,则抛出异常

附:很高兴看到 MoreLinq 得到了一些关注:)

其他提示

一些统计员表现不好,如果处置不叫;这是针对非泛型的人作为一般的人(非一般的人需要的代码或者鸭式的Dispose调用或者强制转换为IDisposable接口,然后调用IDisposable.Dispose)同样如此。这是好习惯的问题,确保了IEnumerator对象得到处置;我认为有必要,它接受未知类型的IEnumerable任何例程的正确性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top