Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 最快实施IList<;T>/i收集<;T>;在添加/删除元素方面_C#_.net_C# 4.0_Collections - Fatal编程技术网

C# 最快实施IList<;T>/i收集<;T>;在添加/删除元素方面

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

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

此外,MyClass集合用作事件侦听器对象的容器,因此客户端代码只是订阅(将自身添加到集合)和取消订阅(将自身从集合中移除)。顺序并不重要,不管它是列表的开始/中间/结尾

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

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

        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和性能的故事只是一个次要情节。不过,我的问题是“向收藏中添加/删除项目的最快方法是什么?”谢谢。我不清楚。基本上,该集合用作事件侦听器类的容器,所以客户端代码只是订阅(将自身添加到集合)和取消订阅(将自身从集合中移除)。顺序并不重要,不管它是列表的开始/中间/结尾。我把这一点补充到问题上。