-5

linq有什么GetEnumerator()用。

谁能用一个基本的例子向我解释它是如何工作的。

提前致谢。

4

1 回答 1

8

GetEnumerator()返回可用于遍历集合的对象。

假设您有以下数字列表:

var numbers = new List<Int32>() {1, 2, 3, 4, 5};

并希望将所有偶数转换为字符串,您可以编写以下方法:

IEnumerable<string> GetEvenStrings(IEnumerable<Int32> source)
{
    using (var enumerator = source.GetEnumerator())
        while (enumerator.MoveNext())
            if (enumerator.Current % 2 == 0)
                yield return enumerator.Current.ToString();
}

MoveNext方法将具有指向集合中下一个元素的Current属性如果没有剩余元素(否则)将返回。Enumeratorfalsetrue

这是一个如何使用枚举器的非常基本的示例。更复杂和实际的用途是例如该方法的这种实现Zip

private static IEnumerable<TResult> ZipImpl<TFirst, TSecond, TResult>( 
    IEnumerable<TFirst> first, 
    IEnumerable<TSecond> second, 
    Func<TFirst, TSecond, TResult> resultSelector) 
{ 
    using (IEnumerator<TFirst> iterator1 = first.GetEnumerator()) 
    using (IEnumerator<TSecond> iterator2 = second.GetEnumerator()) 
    { 
        while (iterator1.MoveNext() && iterator2.MoveNext()) 
        { 
            yield return resultSelector(iterator1.Current, iterator2.Current); 
        } 
    } 
}

(这段代码来自 Jon Skeet 的Edulinq 项目,我强烈推荐)

在此示例中,Enumerator用于同时迭代两个集合,从而产生一个集合。


通常,Enumerator如果您想逐步迭代集合以应用一些逻辑,并且您不想先使用整个集合,则可能需要使用 an,因为集合可能正在使用延迟执行

于 2012-07-17T13:54:15.023 回答