可以在c#.net中使用多个迭代器(对于单个类或对象)吗?如果是给我一些简单的例子。对不起,如果问题不明白,请告诉我。
答案 0 :(得分:7)
您当然可以创建不同的迭代器以不同的方式遍历。例如,您可以:
public class Tree<T>
{
public IEnumerable<T> IterateDepthFirst()
{
// Iterate, using yield return
...
}
public IEnumerable<T> IterateBreadthFirst()
{
// Iterate, using yield return
...
}
}
这是你问的那种事吗?
你也可能会写:
public class Foo : IEnumerable<int>, IEnumerable<string>
但这会导致很多混淆,而foreach
循环会选择任何一个未明确实现GetEnumerator
调用的循环。
你可以同时同时在同一个集合上多次迭代:
foreach (Person person1 in party)
{
foreach (Person person2 in party)
{
if (person1 != person2)
{
person1.SayHello(person2);
}
}
}
答案 1 :(得分:1)
如果你的意思是你可以为一个类实现多个迭代器,或者你是否可以一次为一个类使用多个迭代器,那就不是很清楚了。两种都是可能的。
您可以为类创建任意数量的迭代器:
public class OddEvenList<T> : List<T> {
public IEnumerable<T> GetOddEnumerator() {
return this.Where((x, i) => i % 2 == 0);
}
public IEnumerable<T> GetEvenEnumerator() {
return this.Where((x, i) => i % 2 == 1);
}
}
对于同时处于活动状态的类,您可以拥有尽可能多的迭代器实例:
foreach (int x in list) {
foreach (int y in list) {
foreach (int z in list) {
...
}
}
}
答案 2 :(得分:0)
一种选择是实施战略模式:
当然,这意味着两个尝试同时设置策略的线程可能会产生干扰,因此如果在线程之间共享集合很重要,那么这不是最佳解决方案。
一个直接的迭代器模式也可以工作,这就是我相信Jon Skeet在他的第一个例子中提出的建议,但你失去了能够使用foreach的语法糖。