C#:IEnumerator<;T>;在using语句中

C#:IEnumerator<;T>;在using语句中,c#,ienumerable,idisposable,using-statement,ienumerator,C#,Ienumerable,Idisposable,Using Statement,Ienumerator,我很好奇地想看看SingleOrFallback方法是如何在中实现的,并发现了一些我以前从未见过的东西: public static T SingleOrFallback<T>(this IEnumerable<T> source, Func<T> fallback) { source.ThrowIfNull("source"); fallback.ThrowIfNull("fallback");

我很好奇地想看看
SingleOrFallback
方法是如何在中实现的,并发现了一些我以前从未见过的东西:

    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;
        }
    }
publicstatict SingleOrFallback(此IEnumerable源代码,Func fallback)
{
来源:ThrowIfNull(“来源”);
撤退。通过撤退(“撤退”);
使用(IEnumerator迭代器=source.GetEnumerator())
{
如果(!iterator.MoveNext())
{
返回回退();
}
T first=迭代器.Current;
if(iterator.MoveNext())
{
抛出新的InvalidOperationException();
}
先返回;
}
}
为什么
IEnumerator
中使用
语句?在
IEnumerable
上使用
foreach
时,是否也应该考虑这一点

旁白:这个方法到底做什么?当源序列不完全包含一个项时,它是否返回回退项?

IEnumerator
扩展了
IDisposable
,因此应该在using语句中包含它
foreach
自动执行此操作。(非泛型的
IEnumerator
没有扩展
IDisposable
,但C#编译器仍会生成有条件地调用
Dispose
的代码。出于某种原因,这是C#1.0和1.2之间(少数)变化之一,其中1.2是与.NET 1.1一起提供的版本。)

解释为什么这在迭代器块上下文中很重要

至于该方法的作用:

  • 如果序列为空,则返回回退项
  • 如果序列只有一项,则返回它
  • 如果序列有多个项,则引发异常

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

如果不调用Dispose,一些枚举数的行为会很糟糕;这对于非泛型代码和泛型代码一样适用(非泛型代码要求代码要么键入Dispose调用,要么强制转换为IDisposable,然后调用IDisposable.Dispose)。这是一个好习惯,以确保IEnumerator对象得到处置;我认为接受任何未知类型的例程的正确性是必要的。

呵呵,是的。由于MaxBy和MinBy方法,我们将它添加到了我们的项目中。当添加类似的内容时,您必须始终检查是否还有其他可以使用的内容;)但不确定此SingleOrFallback方法对什么有用。。。你能解释一下你用它做什么吗?理解它现在做什么,但不要理解何时使用这样的方法:pSure:假设您有一个搜索,它应该返回一个结果(如果有的话)。如果它不返回任何内容,您希望有某种默认值,但如果有多个结果(这表明存在bug),则会死掉。基本上它是SingleOrDefault,但有一个指定的默认值作为函数,除非需要,否则不会被调用。啊哈。但是SingleOrDefault也包含一个谓词,对吗?因此,要使用这个SingleOrFallback,您可以使用Where(谓词),然后使用SingleOrFallback?SingleOrDefault有一个带谓词的重载,yes。如果需要的话,我们也可以在Single或Fallback中添加一个,但在其他地方就可以了。