【发布时间】:2015-07-15 15:48:04
【问题描述】:
我以与往常相同的方式为 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 中循环,而是将_someList 转换为IEnumerable<T>,然后使用现有的GetEnumerator() 方法返回相同的结果。
我以前没有见过这个实现,我想知道在你真的没有任何自定义放入枚举器的情况下使用它是否有任何危险。我还想知道使用一种实现是否比另一种实现有什么好处。
【问题讨论】:
-
因为不要重新发明轮子
-
IEnumerable<T>已经在框架中编写了枚举器实现 -
@Ehsan - 老实说,我就是这么想的。但这也是为什么我很惊讶我以前没有见过这个实现的原因。这确实很有意义。
-
唯一立即跳出来的明显问题是,如果 _someList 不强制转换为
IEnumerable<T>。 -
不需要实现GetEnumerator()
标签: c# linq ienumerable ienumerator