在添加/删除元素方面,IList <T>/ICollection <T>的最快实现

dra*_*fly 2 .net c# collections c#-4.0

我在一个类(我们称之为MyClass)中发现了一些非常讨厌的代码,这些代码广泛使用了T.Add/Remove方法.同一个类也将该集合公开为具有T类型的IList的属性,因此更改类型将涉及一些重构.

此外,MyClass集合用作事件侦听器对象的容器,因此客户端代码只是订阅(将自身添加到集合)和取消订阅(从集合中删除).订单无关紧要,无论是列表的开始/中间/结尾.

为了提高性能,我想替换内部实现细节,替换List of T ....我不知道是什么.我尝试了T的LinkedList,但它没有实现T的IList.我在MSDN看了T的IList,但是没有实现IList的类列表,所以我可以比较文档.

另一件事是我试图将T的IList更改为ICollection of T,这可能是一个解决方案(因为MyClass的客户端代码使用Add/Remove方法,所以不需要重构)但有趣的事情发生了:

        LinkedList<string> list = new LinkedList<string>();
        list.Add("test");
Run Code Online (Sandbox Code Playgroud)

我收到错误时,此代码无法编译:

'System.Collections.Generic.LinkedList'不包含'添加'的定义,也没有扩展方法'添加'

但当我把它改为:

        ICollection<string> list = new LinkedList<string>();
        list.Add("test");
Run Code Online (Sandbox Code Playgroud)

然后我工作了.你能解释一下为什么第一个样本没有编译+告诉你在添加/删除项目方面最快的.NET Framework中的Tist实现是什么?

谢谢.

Jon*_*eet 5

LinkedList<T>实际上,ICollection<T>使用显式接口实现.因此,该Add方法仅在您"查看"时才可用ICollection<T>.

关键是如果你知道你正在使用链表,你应该使用AddFirstAddLast代替.