如何使用GetEnumerator()

Raj*_*hit -5 linq

GetEnumerator()linq中有什么用?

任何人都可以向我解释它是如何工作的基本例子.

提前致谢.

slo*_*oth 8

GetEnumerator()返回可用于迭代集合的对象.

假设您有以下数字列表:

var numbers = new List<Int32>() {1, 2, 3, 4, 5};
Run Code Online (Sandbox Code Playgroud)

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

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

MoveNext的方法将有目前的物业Enumerator点集合中的一个元素,并返回false如果没有离开(否则元素true).

这是如何使用枚举器的一个非常基本的示例.更为复杂和实际使用是如此实现了的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); 
        } 
    } 
}
Run Code Online (Sandbox Code Playgroud)

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

在此示例中,Enumerator用于同时迭代两个集合,从而生成单个集合.


通常,Enumerator如果要逐步迭代集合以应用某些逻辑,并且您不希望首先使用整个集合,则可能需要使用an,因为集合可能正在使用deffered执行.