Tag: 集合

来自C5 Generic Collection Library的小型集合相对来说非常慢 – 可以做任何事情吗?

我最近一直在用C#测试C5系列,我很喜欢它们的function。 对于大型馆藏,性能似乎与通用同行相当。 对于小型集合,它们明显较慢。 我怀疑相对速度的急剧恶化来自于C5系列的恒定时间操作。 我所知道的一个操作是触发事件。 这可能是小型collections品表现不佳的原因吗? 可以通过关闭某些function来解决这个问题吗? 这是’性能测试: //Two containers to be tested. ‘Test’ is a wrapper over decimal. var arrayList = new C5.ArrayList(); var genericList = new System.Collections.Generic.List(); var toBeAdded = new List(); var watch = new Stopwatch(); //Fill both tested containers for (int i = 10; i > 0; i–) { var test […]

如何获取字典中的键的ReadOnlyCollection

我的类包含Dictionary dict ,我想公开键的ReadOnlyCollection 。 如何在不将Dictionary.KeyCollection dict.Keys到数组然后将数组作为ReadOnlyCollection公开的情况下执行此操作? 我希望ReadOnlyCollection是一个合适的包装器,即。 反映基础字典中的变化,据我所知,将集合复制到数组将不会这样做(以及看似效率低下 – 我实际上并不想要一个新的集合,只是为了公开底层的密钥集合.. )。 任何想法将不胜感激! 编辑:我正在使用C#2.0,因此没有.ToList(轻松)可用的扩展方法。

传递接口集合

假设您有以下课程: class Car : IPainting { … } 然后像这样的函数: void AddCars(IEnumerable collection) 然后像这样的代码片段: Car bmw = new Car(); Car mercedes = new Car(); IPainting a = (IPainting) bmw; IPainting b = (IPainting) mercedes; IPainting[] paintings = new IPainting[] {a, b}; AddCars(paintings); // fails to compile 这当然不能编译,因为AddCars()方法只接受Cars的集合,但它是’painting’数组的组成部分。 我知道C#4.0可能会为此提供解决方案。 今天有没有解决方法呢? 谢谢, 阿尔贝托

C#中速度最快,效率最高的集合类型

我正在构建一个应用程序,需要一个集合来容纳大约10k的字符串。 集合将用作队列。 因此,在C#中查看不同的集合类型,但无法确定哪一个在Queue中执行Put和Get操作的速度方面具有最佳性能。 也应该能够不允许在队列/集合中重复。 根据评论编辑.. 任何现有的collections都会有所帮助。 或者可以执行任何现有集合的自定义集合将是很棒的。 谢谢

初始化集合时,hashset对内存有什么作用?

我偶然发现了以下问题。 我想要一个所有数字从1到100.000.000的哈希集。 我尝试了以下代码: var mySet = new HashSet(); for (var k = 1; k <= 100000000; k++) mySet.Add(k); 那个代码没有成功,因为我在49mil附近的内存溢出。 这也很慢,内存增长过度。 然后我尝试了这个。 var mySet = Enumerable.Range(1, 100000000).ToHashSet(); 其中ToHashSet()是以下代码: public static HashSet ToHashSet(this IEnumerable source) { return new HashSet(source); } 我再次获得了内存溢出,但是我能够使用之前的代码输入更多数字。 有效的方法如下: var tempList = new List(); for (var k = 1; k <= 100000000; k++) tempList.Add(k); […]

.NET ConcurrentDictionary初始容量设置为MSDN示例文档中的任意素数而不是预期容量。 为什么?

我只是在查看ConcurrentDictionary的MSDN文档 ,我在“示例”代码中看到了这一点: // We know how many items we want to insert into the ConcurrentDictionary. // So set the initial capacity to some prime number above that, to ensure that // the ConcurrentDictionary does not need to be resized while initializing it. int NUMITEMS = 64; int initialCapacity = 101; 作为参考,MSDN示例中的字典初始化如下: ConcurrentDictionary cd = new […]

确定整数列表中的第一个可用值

我得到了一个简单的整数列表。 List myInts = new List(); myInts.Add(0); myInts.Add(1); myInts.Add(4); myInts.Add(6); myInts.Add(24); 我的目标是从List中获取第一个未使用的(可用)值。 (集合中尚未出现的第一个正值) 在这种情况下,答案是2。 这是我目前的代码: int GetFirstFreeInt() { for (int i = 0; i < int.MaxValue; ++i) { if(!myInts.Contains(i)) return i; } throw new InvalidOperationException("All integers are already used."); } 有没有更好的办法? 也许使用LINQ? 你会怎么做? 当然,我在这里使用了简单但我的问题适用于任何类型。

集合类及其使用

我遇到了以下代码: var collection = new Collection(); 我没有看到Collection类使用太多,也找不到太多关于它的用途的信息。 查看.NET Framework源代码,它几乎只是List的包装器,因为它存储了List成员字段。 它的构造函数如下: public Collection() { this.items = (IList) new List(); } 它还实现了IList。 所以你可以将Collection声明为: IList collection = new Collection(); 对我来说,在function上等同于创建一个List: IList collection = new List(); 那么你什么时候想在自己的代码中使用它? 我看到它是其他.NET集合的基类,但为什么它们将它作为公共具体 (而不是内部和/或抽象)包含在内? 关于可能重复的注释 – 相关问题的答案似乎表明Collection类应该用作基类。 我真正要求的不同之处在于: 如果在您自己的代码中使用,为什么不使用List作为基类呢? 在您自己的代码中实例化一个新的集合代替List真的有意义吗? 如果真的只是作为基类提供, 为什么它不是抽象的 ?

如何枚举实现通用接口的所有项目?

我有两个接口,一个generics和一个非generics,具有inheritance层次结构: public interface IGenericRelation : IRelation public interface IRelation 通用的是由几个动态加载的服务器控件实现的,我希望枚举实现此接口的控件集合。 我可以做以下事情 foreach (IRelation relationControl in this.uiPlhControls.Controls.OfType<IRelation) { … } 但我真正希望能做的是…… foreach (IGenericRelation relationControl in this.uiPlhControls.Controls.OfType<IGenericRelation) { … } 然后能够将relationControl与它提供的类型一起使用,然后我就可以访问IGenericRelation上可用的强类型属性。 不幸的是,这是不可能的,因为我似乎无法省略类型参数。 有没有人知道枚举实现通用接口的控件的方法,以防止我必须编写几个循环而不是一个循环? 或许使用reflection?

如何有效地从List 中删除(C#)?

如果我理解正确(如果我错了请纠正我),列表是由.NET中的数组实现的,这意味着列表中每个项目的删除都会导致重新分配所有列表(这反过来意味着O(n) )。 我正在开发一款游戏,在游戏中我有许多子弹在任何给定时刻在空中飞行,让我们说100个子弹,每帧我移动几个像素并检查与游戏中物体的碰撞,我需要删除从列表中每个碰撞的子弹。 所以我在另一个临时列表中收集了碰撞的子弹,然后执行以下操作: foreach (Bullet bullet in bulletsForDeletion) mBullets.Remove(bullet); 因为循环是O(n)并且删除是O(n) ,所以我花费O(n^2 )时间来移除。 有没有更好的方法来删除它,或更合适的集合使用?