C# 3.0 在c#中是否可以使用多个迭代器?
在c#.net中是否可以使用多个迭代器(针对单个类或对象)?如果是,请给我一些简单的例子。对不起,如果这个问题不可理解,请让我说清楚 您当然可以创建不同的迭代器以不同的方式进行遍历。例如,您可以:C# 3.0 在c#中是否可以使用多个迭代器?,c#-3.0,C# 3.0,在c#.net中是否可以使用多个迭代器(针对单个类或对象)?如果是,请给我一些简单的例子。对不起,如果这个问题不可理解,请让我说清楚 您当然可以创建不同的迭代器以不同的方式进行遍历。例如,您可以: public class Tree<T> { public IEnumerable<T> IterateDepthFirst() { // Iterate, using yield return ... } pu
public class Tree<T>
{
public IEnumerable<T> IterateDepthFirst()
{
// Iterate, using yield return
...
}
public IEnumerable<T> IterateBreadthFirst()
{
// Iterate, using yield return
...
}
}
您当然可以创建不同的迭代器以不同的方式进行遍历。例如,您可以:
public class Tree<T>
{
public IEnumerable<T> IterateDepthFirst()
{
// Iterate, using yield return
...
}
public IEnumerable<T> IterateBreadthFirst()
{
// Iterate, using yield return
...
}
}
一种选择是实施战略模式:
直接迭代器模式也可以工作,这是我相信Jon Skeet在他的第一个示例中所建议的,但是您失去了能够使用foreach的语法优势。一个选项是实现策略模式:
直接迭代器模式也可以工作,这是我相信Jon Skeet在他的第一个示例中所建议的,但是您失去了能够使用foreach的语法优势。不太清楚您的意思是可以为一个类实现多个迭代器,还是一次可以为一个类使用多个迭代器。两者皆有可能 一个类可以有任意多个迭代器:
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);
}
}
还不清楚您的意思是可以为一个类实现多个迭代器,还是一次可以为一个类使用多个迭代器。两者皆有可能 一个类可以有任意多个迭代器:
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);
}
}
如果它们都是显式实现的,会发生什么情况?@Matthew:那么foreach根本不起作用,除非您将目标转换为其中一个接口,此时它将知道调用哪个接口。这是我的信念,无论如何:)所以我们不能让两个GetEnumerator将winthin称为类。是这样吗?@Babu:你必须使用显式接口实现。@Jon Skeet:查看我的下一篇文章。并评论我。如果它们都显式实现了,会发生什么事?@Matthew:那么foreach根本无法工作,除非你将目标转换为其中一个接口,在这一点上,它会知道该呼叫哪个。这就是我的信念:)所以我们不能让两个GetEnumerator调用winthin作为一个类。对吗?@Babu:你必须使用显式接口实现。@Jon Skeet:查看我的下一篇文章。并评论我。@richardtallent:你没有使用foreach的能力。例如,您只需使用“foreach(tree.IterateDepthFirst()中的字符串x)”。@richardtallent:您没有使用foreach的功能。例如,您只需使用“foreach(tree.IterateDepthFirst()中的字符串x)”。
foreach (int x in list) {
foreach (int y in list) {
foreach (int z in list) {
...
}
}
}