【发布时间】:2014-07-24 03:21:00
【问题描述】:
我正在尝试显示带有过滤器和不带过滤器的列表元素。在这里,我使用过滤器来显示可被 3 整除的元素。我将使用 Enumerable 和 Enumerator 接口来实现列表迭代。我正在努力解决这个问题,但我空手而归,我确信逻辑并且无法追踪我犯错的地方。所以,我只是把我所有的代码放在下面。
在FilterDisplay类中,定义了list并调用了GetEnumerator()方法,它被用作
public class FilterDisplay {
public void TestIterators(){
List<int> myList = new List<int> { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
for (int i = 0; i < myList.Count; i++)
Console.Write("{0} ", myList[i]);
Console.WriteLine();
IEnumerator<int> pi = myList.GetEnumerator();
while (pi.MoveNext()){
int x = pi.Current;
Console.Write("{0} ", x);
}
Console.WriteLine();
MyIntList myIntList = new MyIntList { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
IEnumerator<int> px = myIntList.GetEnumerator(x => 0 == x % 3);
while ( px.MoveNext())
Console.Write("{0} ", px.Current);
Console.WriteLine(); // displays 3 9 6 3
Console.ReadKey();
}
}
}
MyIntList 类实现列表接口,GetEnumerator 在类中被定义和覆盖为;
public class MyIntList : IList<int>{
public List<int> MyList = new List<int>();
public MyIntList() { }
public void Add(int item) { MyList.Add(item); }
public IEnumerator<int> GetEnumerator(){
return new Enumerator1(MyList);
}
public IEnumerator<int> GetEnumerator(Func<int, bool> filter){
return new Enumerator1(filter, MyList);
}
在 Enumerator1 类中,我将定义两个构造函数来实现 list 和 list with filter。在这里,我试图覆盖 MoveNext() 和 Current。当我尝试调试项目时,它在 Current 显示错误。但是,我确信这样定义没有错误。
class Enumerator1 : IEnumerator<int>{
private int i = -1;
private MyIntList IntList;
private Func<int, bool> NewFilter;
private IEnumerator<int> NewMyList;
public Enumerator1(IEnumerable<int> list){
this.NewMyList = list.GetEnumerator();
}
public Enumerator1(Func<int, bool> filter, IEnumerable<int> list){
this.NewFilter = filter;
this.NewMyList = list.GetEnumerator();
}
public bool MoveNext(){
i++;
return i < IntList.MyList.Count;
}
public int Current { get { return IntList.MyList[i]; } }
object IEnumerator<int>.Current { get { return NewMyList.Current; } }
public void Dispose() { }
public void Reset() { throw new NotSupportedException(); }
}
除了使用收益回报之外,我欢迎任何建议,谢谢。
【问题讨论】:
-
哪个
Current?由于MoveNext没有反映它,因此显式实现的可能表现得很奇怪(阅读:损坏)。 -
object IEnumerator
.Current 给出错误 - 显式接口声明不是接口的成员。 @Telastyn -
我没明白你的意思 MoveNext 没有反映它。
-
为什么不想使用yield?为什么不简单地使用 Linq 的 Where(i => i % 3 == 0)?
-
这和your earlier question有什么区别?
标签: c# design-patterns oop