rav*_*ven 2 .net c# ienumerable ienumerator yield
我正在开发一个集合类,它应该实现IEnumerator和IEnumerable.
在我的第一个方法中,我直接实现了它们.现在我已经发现了yield关键字,并且我已经能够简化所有内容,将IEnumerator/IEnumerable接口替换为readonly属性,这些值使用yield在循环中返回IEnumerable.
我的问题:是否有可能以这样的方式使用yield,我可以迭代类本身,而不实现IEnumerable/IEnumerator?
即,我想要一个类似于框架集合的功能:
List<int> myList = new List<int>();
foreach (int i in myList)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这有可能吗?
更新:似乎我的问题措辞严厉.我不介意实现IEnumerator或IEnumerable; 我只是认为唯一的方法是使用旧的Current/MoveNext/Reset方法.
你不会有实施IEnumerable<T>或IEnumerable得到foreach工作-但它会是一个好主意,这样做.这很容易做到:
public class Foo : IEnumerable<Bar>
{
public IEnumerator<Bar> GetEnumerator()
{
// Use yield return here, or
// just return Values.GetEnumerator()
}
// Explicit interface implementation for non-generic
// interface; delegates to generic implementation.
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Run Code Online (Sandbox Code Playgroud)
未实现的替代方案IEnumerable<T>只会调用您的Values属性,但仍提供GetEnumerator()方法:
public class Foo
{
public IEnumerator<Bar> GetEnumerator()
{
// Use yield return here, or
// just return Values.GetEnumerator()
}
]
Run Code Online (Sandbox Code Playgroud)
虽然这会起作用,但这意味着你将无法将你的集合传递给任何期望的东西IEnumerable<T>,比如LINQ to Objects.
这是一个鲜为人知的事实,它foreach适用于支持GetEnumerator()返回具有适当类型MoveNext()和Current成员的类型的方法的任何类型.这实际上是允许在泛型之前使用强类型集合,其中迭代集合不会包含值类型等.现在真的没有调用它,IMO.
| 归档时间: |
|
| 查看次数: |
1936 次 |
| 最近记录: |