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执行.
| 归档时间: |
|
| 查看次数: |
3774 次 |
| 最近记录: |