我正在为IEnumerable< T>实现包装类.与我通常使用的方法相同,我注意到ReSharper建议将GetEnumerator方法中的foreach循环转换为LINQ表达式.
出于好奇,我单击“转换为LINQ表达式”,然后将方法从以下方法更改:
public IEnumerator<T> GetEnumerator()
{
foreach (var item in _someList)
{
yield return item;
}
}
进入ReSharper的“ LINQ表达式”结果:
public IEnumerator<T> GetEnumerator()
{
return ((IEnumerable<T>) _someList).GetEnumerator();
}
该代码非常简单:将_someList转换为IEnumerable< T>而不是在那里循环_someList.然后使用任何现有的GetEnumerator()方法返回相同的结果.
我以前从未见过这种实现,并且我想知道在枚举器中没有任何自定义的情况下使用它是否有任何危险.我也想知道使用一种实现相对于另一种实现是否有任何好处.
解决方法:
如果您的非通用GetEnumerator已经完美运行(除了非通用),则没有理由不使用它.在这种情况下,您只想简单地转换为IEnumerable< T>.
如果没有,那么您将需要按照自己已经知道如何使用yield语句滚动自己的语句.