How to create a custom collection in .NET 2.0
嗨,我想创建自定义集合,我正在从CollectionBase类派生自定义集合类,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class MyCollection : System.Collectio.CollectionBase { MyCollection(){} public void Add(MyClass item) { this.List.Add(item); } } class MyClass { public string name; } |
让我问几个问题:
从
如果要创建自己的强类型集合类,并可能在添加/删除项时自定义集合行为,则需要从新的(to.NET 2.0)类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public class MyCollection : Collection<int> { public MyCollection() { } public MyCollection(IList<int> list) : base(list) { } protected override void ClearItems() { // TODO: validate here if necessary bool canClearItems = ...; if (!canClearItems) throw new InvalidOperationException("The collection cannot be cleared while _____."); base.ClearItems(); } protected override void RemoveItem(int index) { // TODO: validate here if necessary bool canRemoveItem = ...; if (!canRemoveItem) throw new InvalidOperationException("The item cannot be removed while _____."); base.RemoveItem(index); } } |
我认为最好使用System.Collections.Generic中定义的容器类之一。
- 不,用列表或其他东西代替。
- 通过。尚未使用WCF。
- 如果使用标准System.Collections.Generic容器类之一,则不会。已经为你做了
- 任何支持IEnumerable的标准集合都将很好地绑定到控件。如果需要排序和筛选,可以使用IBindingListView。
如果需要自己的集合类,还可以从泛型集合继承到非泛型类,例如:
1 2 3 4 | public class MyCollection : List<MyClass> { } |
这样就可以获得列表的所有功能(例如)。您只需要添加一些构造函数。
为什么不使用通用集合?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using System; using System.Collections.Generic; namespace Test { class MyClass { } class Program { static void Main(string[] args) { // this is a specialized collection List<MyClass> list = new List<MyClass>(); // add elements of type 'MyClass' list.Add(new MyClass()); // iterate foreach (MyClass m in list) { } } } } |
编辑:ashu,如果要对添加和删除操作进行一些验证,可以将通用集合用作专用集合的成员:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | using System; using System.Collections.Generic; namespace Test { class MyClass { } class MyClassList { protected List<MyClass> _list = new List<MyClass>(); public void Add(MyClass m) { // your validation here... _list.Add(m); } public void Remove(MyClass m) { // your validation here... _list.Remove(m); } public IEnumerator<MyClass> GetEnumerator() { return _list.GetEnumerator(); } } class Program { static void Main(string[] args) { MyClassList l = new MyClassList(); l.Add(new MyClass()); // iterate foreach (MyClass m in l) { } } } } |
也许我这里遗漏了一些东西,但是如果您只需要添加验证,那么为什么不从泛型集合继承并重写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |