相关疑难解决方法(0)

.NET:如何有效地检查List <string>中50,000项的唯一性?

在某些库代码中,我有一个可以包含50,000个或更多项的List.

库的调用者可以调用导致字符串添加到列表的方法.如何有效地检查要添加的字符串的唯一性?

目前,在添加字符串之前,我扫描整个列表并将每个字符串与要添加的字符串进行比较.这开始显示超过10,000个项目的规模问题.

我将对此进行基准测试,但对洞察力感兴趣.

  • 如果我用List <>替换List <>,那么随着列表增长到10,000个项目以及更高,ContainsKey()会更快吗?
  • 如果我推迟了所有项目添加后的唯一性检查,它会更快吗?在那一点上,我需要检查每个元素与每个其他元素,仍然是一个n ^^ 2操作.

编辑

一些基本的基准结果.我创建了一个抽象类,它暴露了两种方法:Fill和Scan.填充只用n个项目填充集合(我用了50,000).扫描扫描列表m次(我使用5000)以查看是否存在给定值.然后我为List构建了该类的实现,为HashSet构建了另一个实现.

使用的字符串长度统一为11个字符,并通过抽象类中的方法随机生成.

一个非常基本的微观基准.

Hello from Cheeso.Tests.ListTester
filling 50000 items...
scanning 5000 items...
Time to fill: 00:00:00.4428266
Time to scan: 00:00:13.0291180

Hello from Cheeso.Tests.HashSetTester
filling 50000 items...
scanning 5000 items...
Time to fill: 00:00:00.3797751
Time to scan: 00:00:00.4364431
Run Code Online (Sandbox Code Playgroud)

因此,对于该长度的字符串,当扫描唯一性时,HashSet比List快大约25倍.此外,对于此大小的集合,在向集合添加项目时,HashSet对List没有任何惩罚.

结果很有趣,无效.为了获得有效的结果,我需要进行预热间隔,多次试验,随机选择实施.但我相信这只会略微改变这一点.

感谢大家.

EDIT2

在添加随机化和多重试验之后,HashSet在这种情况下始终优于List,大约20倍.

这些结果不一定适用于可变长度,更复杂对象或不同集合大小的字符串.

.net c# collections list hashset

32
推荐指数
3
解决办法
3662
查看次数

Generic Key/Value pair collection in that preserves insertion order?

I'm looking for something like a Dictionary<K,V> however with a guarantee that it preserves insertion order. Since Dictionary is a hashtable, I do not think it does.

Is there a generic collection for this, or do I need to use one of the old .NET 1.1 collections?

.net c# data-structures

30
推荐指数
4
解决办法
3万
查看次数

C#等价于LinkedHashMap

正如问题所说,我正在寻找Java中LinkedHashMap的c#等价物.

我需要能够通过索引检索键值,获取大小.我需要按插入方式排序元素.一个键应该与一个值匹配.

我尝试过的集合(以及它们的问题):
NameValueCollection - 允许一对多链接.我猜这会导致不必要的开销.
OrderedDictionary - 无法通过索引检索密钥.

编辑:有人指出C#中不存在这样的等价物.在链接的问题中,答案指向一个示例实现的论坛,该论坛似乎已关闭.有人可能会提供一个示例实现吗?

编辑2:来自System.Net 的CookieCollection似乎是我需要的.这对较大尺寸(元素数量)有何影响?

c# java collections

6
推荐指数
1
解决办法
7294
查看次数

.NET中是否有一个集合可以同时作为字典和列表使用?

我想要的基本上是一个集合,它是字典和列表的混合体.我想要一个集合,我可以添加键/值对(像一个字典),但同时能够以相同的顺序检索值(没有键)我添加它们(如列表)?这样的集合是否存在于.NET中?

谢谢

.net collections dictionary list generic-collections

2
推荐指数
1
解决办法
312
查看次数

从Dictionary中获取任何元素的最快方法

我在C#中实现A*(不用于寻路),我需要Dictionary来保存开放节点,因为我需要快速插入和快速查找.我想从Dictionary中获得第一个开放节点(它可以是任何随机节点).使用Dictionary.First()非常慢.如果我使用迭代器,则MoveNext()仍然占用程序整个CPU时间的15%.从Dictionary中获取任何随机元素的最快方法是什么?

c# collections performance dictionary

2
推荐指数
1
解决办法
349
查看次数

如何使.NET Hashtable像Java Hashtable一样工作

当我将一些项添加到Java中时Hashtable,它们的顺序与.NET的顺序不同Hashtable.有什么办法可以确保.NET Hashtable与Java具有相同的顺序Hashtable吗?


我正在尝试将一些Java代码移植到C#.Java代码使用a Hashtable来跟踪某些数据.当我通过Java 或.NET (通过一个)迭代检查数据时检查顺序时,每个都按相同顺序始终具有相同的数据......但每个基于代码的顺序不同.HashtableHashtableEnumerator

我有什么方法可以使.NET Hashtable数据与Java的顺序相同Hashtable

我明白Hashtable不要处理订单 - 所以我觉得没有什么可以做的.我也无法改变Java代码中的数据类型..比如说... a Hashtable到别的东西.

这里有一些相同的数据来说明我的情况.

数据,为任一代码库添加顺序: -

  1. num | 一些数据
  2. pagenum | 一些数据
  3. x | 一些数据
  4. 顶部| 一些数据

Java代码:

private Hashtable identifiers = new Hashtable();
...
identifiers.put(symbol, identifier);
Run Code Online (Sandbox Code Playgroud)

通过枚举器迭代的Java输出:

替代文字

.NET代码:

private Hashtable Identifiers = new Hashtable();
...
Identifiers.Add(symbol, identifier);
Run Code Online (Sandbox Code Playgroud)

.NET输出通过枚举器迭代.

替代文字

任何想法或建议?

.net java iterator enumeration hashtable

1
推荐指数
1
解决办法
956
查看次数

KeyValuePair列表

为什么.NET不提供类List<KeyValuePair<T, U>>

我认为当你需要保持一对数组时,有很多情况.例如,

1; 2      "a"; "array"
5; 8      "b"; "browser"
1; 9      "f"; "Firefox"
8; 10     "f"; "frequency"
Run Code Online (Sandbox Code Playgroud)

Àla:

Pairs<int, int> myPairs;

myPairs.Add(10, 8);
myPairs.Add(5, 8);
myPairs.Add(10, 5);
myPairs.Add(1, 4);

myPairs[0].Value1 = 5;
myPairs[5].Value2 = 8;
Run Code Online (Sandbox Code Playgroud)

.net

1
推荐指数
1
解决办法
2万
查看次数