IEnumerable的GetEnumerator()的替代实现包装

本文关键字:实现 包装 GetEnumerator IEnumerable | 更新日期: 2023-09-27 18:02:56

我正在为IEnumerable<T>实现一个包装器类,就像我通常做的那样,我注意到ReSharper建议我将GetEnumerator方法中的foreach循环转换为linq表达式。

出于好奇,我点击了"转换为linq表达式",然后将我的方法从:

public IEnumerator<T> GetEnumerator()
{
    foreach (var item in _someList)
    {
        yield return item;
    }
}

进入ReSharper的"LINQ-expression"结果:

public IEnumerator<T> GetEnumerator()
{
    return ((IEnumerable<T>) _someList).GetEnumerator();
}


代码是相当直接的:而不是循环通过_someList那里,它是铸造_someList作为IEnumerable<T>,然后使用任何现有的GetEnumerator()方法他们是返回相同的结果。

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

IEnumerable<T>的GetEnumerator()的替代实现包装

如果您的非泛型GetEnumerator已经完美地工作(除了非泛型),那么没有理由不使用它。在这种情况下,您只需要将其强制转换为IEnumerable<T>

如果没有,那么您需要使用自己的yield语句,因为您已经知道如何使用。