【问题标题】:Alternative Implementation of GetEnumerator() for IEnumerable<T> WrapperIEnumerable<T> Wrapper 的 GetEnumerator() 的替代实现
【发布时间】:2015-07-15 15:48:04
【问题描述】:

我以与往常相同的方式为 IEnumerable&lt;T&gt; 实现包装类,我注意到 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&lt;T&gt;,然后使用现有的GetEnumerator() 方法返回相同的结果。

我以前没有见过这个实现,我想知道在你真的没有任何自定义放入枚举器的情况下使用它是否有任何危险。我还想知道使用一种实现是否比另一种实现有什么好处。

【问题讨论】:

  • 因为不要重新发明轮子
  • IEnumerable&lt;T&gt; 已经在框架中编写了枚举器实现
  • @Ehsan - 老实说,我就是这么想的。但这也是为什么我很惊讶我以前没有见过这个实现的原因。这确实很有意义。
  • 唯一立即跳出来的明显问题是,如果 _someList 不强制转换为 IEnumerable&lt;T&gt;
  • 不需要实现GetEnumerator()

标签: c# linq ienumerable ienumerator


【解决方案1】:

如果您的非泛型 GetEnumerator 已经完美运行(非泛型除外),那么没有理由使用它。在这种情况下,您可能只想转换为 IEnumerable&lt;T&gt;

如果没有,那么您将需要使用 yield 语句自行开发,因为您已经知道如何操作了。

【讨论】:

  • 我非常喜欢这个答案。这是一个可靠的经验法则。
  • @ZacharyKniebel 正如 Ehsan Sajjad 所说,不要重新发明轮子。这确实是一个可靠的经验法则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2017-10-31
  • 2014-12-04
  • 1970-01-01
  • 2014-01-09
  • 2013-10-27
相关资源
最近更新 更多