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中添加一个,但在其他地方就可以了。