C# 最快实施IList<;T>/i收集<;T>;在添加/删除元素方面
我在一个类(我们称之为MyClass)中发现了一些非常糟糕的代码,它广泛使用了T.Add/Remove方法列表。同样,同一个类将该集合公开为T类型的IList的属性,因此更改该类型将涉及一些重构 此外,MyClass集合用作事件侦听器对象的容器,因此客户端代码只是订阅(将自身添加到集合)和取消订阅(将自身从集合中移除)。顺序并不重要,不管它是列表的开始/中间/结尾 为了提高性能,我想替换内部实现细节,将T列表替换为。。。。我不知道是什么。我尝试了T的LinkedList,但它没有实现T的IList。我查看了,但是没有实现IList的类的列表,所以我可以比较文档 另一件事是,我试图将T的IList更改为T的ICollection,这可能是一个解决方案(因为MyClass的客户机代码使用Add/Remove方法,所以不需要重构),但有趣的事情发生了:C# 最快实施IList<;T>/i收集<;T>;在添加/删除元素方面,c#,.net,c#-4.0,collections,C#,.net,C# 4.0,Collections,我在一个类(我们称之为MyClass)中发现了一些非常糟糕的代码,它广泛使用了T.Add/Remove方法列表。同样,同一个类将该集合公开为T类型的IList的属性,因此更改该类型将涉及一些重构 此外,MyClass集合用作事件侦听器对象的容器,因此客户端代码只是订阅(将自身添加到集合)和取消订阅(将自身从集合中移除)。顺序并不重要,不管它是列表的开始/中间/结尾 为了提高性能,我想替换内部实现细节,将T列表替换为。。。。我不知道是什么。我尝试了T的LinkedList,但它没有实现T的ILis
LinkedList<string> list = new LinkedList<string>();
list.Add("test");
LinkedList=新建LinkedList();
列表。添加(“测试”);
由于出现错误,此代码无法编译:
“System.Collections.Generic.LinkedList”不包含
“添加”和无扩展方法“添加”的定义
但当我把它改成:
ICollection<string> list = new LinkedList<string>();
list.Add("test");
ICollection list=newlinkedlist();
列表。添加(“测试”);
然后我工作。您能解释一下为什么第一个示例没有编译并告诉我们在.NET Framework中,在添加/删除项方面,IList of t的最快实现是什么吗
谢谢。LinkedList
基本上使用实现了ICollection
。因此,Add
方法只有在您将其作为i集合查看时才可用
关键是,如果你知道你在使用链表,你应该使用AddFirst
或AddLast
。没有一个类在添加和删除时最快。它们都是为了在某些情况下更快而设计的,它们也都有各自的缺点<代码>列表
可以在大多数情况下快速添加到末尾,但它会定期进行昂贵的添加,包括复制每个元素。当你开始添加物品时,它会变得越来越贵。移除在最后是便宜的,并且随着你开始移动,移除的成本越来越高
LinkedList
可以有效地添加到开始或结束,但是这些添加仍然比添加到列表的结尾要慢一些(但是没有任何真正大的添加)。添加到LinkedList的开始或结束位置以外的其他位置
快速获得更高的成本。在大多数实际情况下,从性能角度来看,LinkedList
不是一个好的选择
我可以继续,但那需要一段时间。重点仍然是,我们需要了解有关如何使用集合的更多详细信息,以便提出更高性能的替代方案(或使用现有集合的不同方式)
因为您已经描述过,您所拥有的只是一组不需要排序的数据,只需要有效地添加/删除/迭代,所以所有最好的集合都将是一个HashSet
。您可以自己研究基于散列的数据结构的内部工作原理(这很酷),但关键是它是一个无序的数据结构,可以非常高效地添加/删除元素,并且可以高效地进行迭代。这非常适合你的情况。基于散列的数据结构需要记住的一点是,对象需要实现有意义的GetHashCode
和Equals
(默认值通常不适用于自定义类型)。如果您使用int
或string
作为键,那么它已经有了很好的实现。您试图提高性能的事实似乎与问题的其余部分无关。。。请随意将其从标题中删除。实际上,关于MyClass和性能的故事只是一个次要情节。不过,我的问题是“向收藏中添加/删除项目的最快方法是什么?”谢谢。我不清楚。基本上,该集合用作事件侦听器类的容器,所以客户端代码只是订阅(将自身添加到集合)和取消订阅(将自身从集合中移除)。顺序并不重要,不管它是列表的开始/中间/结尾。我把这一点补充到问题上。