linq有什么GetEnumerator()
用。
谁能用一个基本的例子向我解释它是如何工作的。
提前致谢。
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属性,如果没有剩余元素(否则)将返回。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);
}
}
}
(这段代码来自 Jon Skeet 的Edulinq 项目,我强烈推荐)
在此示例中,Enumerator
用于同时迭代两个集合,从而产生一个集合。
通常,Enumerator
如果您想逐步迭代集合以应用一些逻辑,并且您不想先使用整个集合,则可能需要使用 an,因为集合可能正在使用延迟执行。