在 C# 中实现一个自定义集合类通常需要定义一个类,该类实现一个或多个集合相关的接口,比如 IEnumerable
示例:自定义集合类CustomCollection
using System;
using System.Collections;
using System.Collections.Generic;
public class CustomCollection : ICollection
{
private List items = new List();
// ICollection 属性
public int Count => items.Count;
public bool IsReadOnly => false;
// 添加元素
public void Add(T item)
{
items.Add(item);
}
// 清空集合
public void Clear()
{
items.Clear();
}
// 判断是否包含某个元素
public bool Contains(T item)
{
return items.Contains(item);
}
// 将集合的内容复制到数组
public void CopyTo(T[] array, int arrayIndex)
{
items.CopyTo(array, arrayIndex);
}
// 移除元素
public bool Remove(T item)
{
return items.Remove(item);
}
// 获取迭代器
public IEnumerator GetEnumerator()
{
return items.GetEnumerator();
}
// 非泛型迭代器
IEnumerator IEnumerable.GetEnumerator()
{
return items.GetEnumerator();
}
// 额外的功能:按索引访问
public T this[int index]
{
get => items[index];
set => items[index] = value;
}
}
class Program
{
static void Main(string[] args)
{
// 创建自定义集合
CustomCollection collection = new CustomCollection();
// 添加元素
collection.Add("Alice");
collection.Add("Bob");
collection.Add("Charlie");
// 遍历集合
Console.WriteLine("Elements in the collection:");
foreach (var item in collection)
{
Console.WriteLine(item);
}
// 检查是否包含某个元素
Console.WriteLine($"Collection contains 'Bob': {collection.Contains("Bob")}");
// 移除元素
collection.Remove("Bob");
Console.WriteLine($"Collection contains 'Bob' after removal: {collection.Contains("Bob")}");
}
}
关键点解析
- 基础存储:使用内部数据结构(如 List
)存储集合元素。 - 实现接口:ICollection
是基本的集合接口,提供集合的增删、查询和遍历功能。实现 IEnumerable 可以使集合支持 foreach 遍历。 - 索引器:提供按索引访问元素的能力,通常用在更高级的集合类型(如 IList
)。 - 自定义逻辑:可以在方法中添加业务逻辑,比如自定义排序规则、去重操作等。
接口选择的依据
根据集合的用途和复杂性,可以选择实现不同的接口:
接口 | 描述 |
IEnumerable | 支持集合的迭代,例如 foreach 循环。 |
ICollection | 提供集合的基本操作,例如添加、删除、计数。 |
IList | 提供按索引访问的能力,同时继承了 ICollection |
IDictionary | 键值对集合,类似于 Dictionary |
使用场景
- 封装特定逻辑:当需要对集合元素的添加、移除、查询等操作添加特定逻辑时,可以创建自定义集合。
- 扩展现有集合功能:当内置集合无法满足特定需求(如自定义排序、线程安全等)时,可以创建自定义集合类。
- 领域特定需求:当集合需要与业务领域紧密结合时,例如实现一个只接受特定类型对象的集合。
通过实现自定义集合类,可以更灵活地满足特殊的需求,同时还能够重用标准集合接口的便利功能。这种设计既能保证与 C# 的集合生态兼容,又能添加特定业务逻辑。