如何使用GetEnumerator()

时间:2012-07-17 10:11:34

标签: linq

linq GetEnumerator()的用途是什么?

任何人都可以向我解释一下如何使用基本的例子。

提前致谢。

1 个答案:

答案 0 :(得分: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方法将Enumerator的{​​{3}}属性指向集合中的下一个元素,如果没有元素,则返回false(否则为{ {1}})。

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

Zip

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

在此示例中,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); } } } 用于同时迭代两个集合,从而产生单个集合。


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