C#中正确继承SortedList类的方法及相关疑问
嘿,我来帮你把这个SortedList继承的问题掰扯清楚~
先纠正一个核心误区
你一开始写的:
public class Plates : SortedList<string,Plate> { }
其实是完全合法且正确的!你后面加的那个内部plateList实例完全是多余的——因为继承本身已经让Plates类拥有了SortedList<string,Plate>的所有成员(索引、Add/Remove方法、排序逻辑等等),不需要再额外存一个集合对象。
如何给Plates添加自定义索引
如果你想扩展索引方式(比如除了用string键,还想用Plate的某个属性来查找),可以重载索引器:
public class Plate { // 假设Plate类有这些属性 public string Name { get; set; } public int Id { get; set; } public string Material { get; set; } } public class Plates : SortedList<string, Plate> { // 自定义索引器:按Plate的Id查找 public Plate this[int plateId] { get { // 从集合的Values里筛选对应Id的Plate return Values.FirstOrDefault(p => p.Id == plateId); } } // 基类已经提供了string键的索引,不用重复写,直接用就行: // Plate myPlate = plates["PlateName"]; }
如何添加自定义方法
你可以给Plates类添加任何你需要的业务方法,比如批量添加、筛选特定类型的Plate:
public class Plates : SortedList<string, Plate> { // 批量添加Plate,自动用Plate的Name作为键 public void AddRange(IEnumerable<Plate> platesToAdd) { foreach (var plate in platesToAdd) { if (ContainsKey(plate.Name)) { throw new ArgumentException($"Plate named {plate.Name} already exists!"); } Add(plate.Name, plate); } } // 筛选出所有陶瓷材质的Plate public IEnumerable<Plate> GetCeramicPlates() { return Values.Where(p => p.Material.Equals("Ceramic", StringComparison.OrdinalIgnoreCase)); } }
关于你提到的Enumerable继承困惑
你说继承Enumerable时需要添加额外枚举方法,其实这里有个概念混淆:Enumerable是静态类,我们一般是通过扩展方法来扩展它的功能,而不是继承它。而SortedList<TKey,TValue>本身已经实现了IEnumerable<T>接口,所以你的Plates类自动继承了这个接口的实现,直接就能用foreach遍历,不需要额外写枚举逻辑。
最后再总结下正确姿势
- 直接继承
SortedList<string,Plate>就足够,不需要内部再实例一个集合 - 按需添加自定义索引器、方法来扩展基类没有的功能
- 如果只是需要默认的SortedList功能,空的继承类完全能用
内容的提问来源于stack exchange,提问作者PetrasVestartasEPFL
相关产品推荐
相关产品推荐

