3 回答
TA贡献1859条经验 获得超6个赞
如果您选择使用通用集合(例如List<MyObject>而不是)ArrayList,则会发现List<MyObject>会同时提供您可以使用的通用和非通用枚举器。
using System.Collections;
class MyObjects : IEnumerable<MyObject>
{
List<MyObject> mylist = new List<MyObject>();
public MyObject this[int index]
{
get { return mylist[index]; }
set { mylist.Insert(index, value); }
}
public IEnumerator<MyObject> GetEnumerator()
{
return mylist.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
TA贡献1880条经验 获得超4个赞
您可能不想要显式的实现IEnumerable<T>(这就是您所显示的)。
通常的模式是使用IEnumerable<T>的GetEnumerator在明确的执行IEnumerable:
class FooCollection : IEnumerable<Foo>, IEnumerable
{
SomeCollection<Foo> foos;
// Explicit for IEnumerable because weakly typed collections are Bad
System.Collections.IEnumerator IEnumerable.GetEnumerator()
{
// uses the strongly typed IEnumerable<T> implementation
return this.GetEnumerator();
}
// Normal implementation for IEnumerable<T>
IEnumerator<Foo> GetEnumerator()
{
foreach (Foo foo in this.foos)
{
yield return foo;
//nb: if SomeCollection is not strongly-typed use a cast:
// yield return (Foo)foo;
// Or better yet, switch to an internal collection which is
// strongly-typed. Such as List<T> or T[], your choice.
}
// or, as pointed out: return this.foos.GetEnumerator();
}
}
TA贡献1818条经验 获得超11个赞
请注意,另一种已IEnumerable<T>实现的System.Collections方法是MyObjects从类派生您的类System.Collections作为基类(documentation):
System.Collections:提供通用集合的基类。
我们以后可以使我们自己实行重写虚拟System.Collections方法,以提供定制的行为(仅适用于ClearItems,InsertItem,RemoveItem,和SetItem沿Equals,GetHashCode以及ToString从Object)。不同于,List<T>后者的设计不容易扩展。
例:
public class FooCollection : System.Collections<Foo>
{
//...
protected override void InsertItem(int index, Foo newItem)
{
base.InsertItem(index, newItem);
Console.Write("An item was successfully inserted to MyCollection!");
}
}
public static void Main()
{
FooCollection fooCollection = new FooCollection();
fooCollection.Add(new Foo()); //OUTPUT: An item was successfully inserted to FooCollection!
}
请注意,collection仅在需要自定义收集行为的情况下才建议使用这种驱动,这种情况很少发生。见用法。
- 3 回答
- 0 关注
- 572 浏览
添加回答
举报