相关疑难解决方法(0)

c#中的多键字典?

我知道BCL中没有一个,但有人能指出我一个好的开源吗?

By Multi我指的是2把钥匙.;-)

c# dictionary

112
推荐指数
10
解决办法
15万
查看次数

复合键字典

我在List中有一些对象,比方说List<MyClass>,MyClass有几个属性.我想基于MyClass的3个属性创建列表的索引.在这种情况下,2个属性是int,而一个属性是datetime.

基本上我希望能够做到这样的事情:

Dictionary< CompositeKey , MyClass > MyClassListIndex = Dictionary< CompositeKey , MyClass >();
//Populate dictionary with items from the List<MyClass> MyClassList
MyClass aMyClass = Dicitonary[(keyTripletHere)];
Run Code Online (Sandbox Code Playgroud)

我有时会在列表上创建多个字典来索引它所拥有的类的不同属性.我不知道如何最好地处理复合键.我考虑过对三个值进行校验和,但这会产生碰撞的风险.

c# dictionary

80
推荐指数
6
解决办法
5万
查看次数

C#中使用MultiDimensional键的Hashtable

我基本上是在寻找一种方法来使用c#中的二维类型键来访问哈希表值.

最终我可以做这样的事情

HashTable[1][false] = 5;
int a = HashTable[1][false];
//a = 5
Run Code Online (Sandbox Code Playgroud)

这就是我一直在尝试的......没有用

Hashtable test = new Hashtable();
test.Add(new Dictionary<int, bool>() { { 1, true } }, 555);
Dictionary<int, bool> temp = new Dictionary<int, bool>() {{1, true}};
string testz = test[temp].ToString(); 
Run Code Online (Sandbox Code Playgroud)

c# dictionary hashtable

62
推荐指数
7
解决办法
7万
查看次数

为什么ValueType.GetHashCode()实现得像?

ValueType.cs

**Action: Our algorithm for returning the hashcode is a little bit complex. We look 
**        for the first non-static field and get it's hashcode.  If the type has no 
**        non-static fields, we return the hashcode of the type. We can't take the
**        hashcode of a static member because if that member is of the same type as 
**        the original type, we'll end up in an infinite loop.

今天当我使用KeyValuePair作为字典中的键(它存储了xml属性名称(枚举)和它的值(字符串))时,我被它咬了,并期望它根据其所有字段计算它的哈希码,但根据实施情况,它只考虑了关键部分.

示例(来自Linqpad的c/p):

void Main()
{
    var kvp1 = …
Run Code Online (Sandbox Code Playgroud)

c# gethashcode

23
推荐指数
3
解决办法
7741
查看次数

我为什么不*覆盖GetHashCode()?

搜索正确组合成分哈希码的帮助器GetHashCode()似乎带来了一些敌意.我从评论中得到的印象是,一些C#开发人员认为你不应该GetHashCode()经常覆盖- 当然一些评论者似乎认为帮助正确行为的图书馆将毫无用处.这种功能在Java中被认为是有用的,Java 社区要求将它添加到JDK中,现在已经在JDK 7中了.

是否有一些基本原因在C#中你不需要 - 或者绝对不应 - 像Java一样频繁地覆盖GetHashCode()(并相应地Equals())?我发现自己经常使用Java来做这件事,例如,每当我创建一个我知道要保留的类型HashSet或者用作HashMap(等同于.net Dictionary)中的键时.

.net c# java hash

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

使用KeyValuePair作为键的字典的糟糕表现(C#.NET)

在我正在编写的应用程序中,我有两个可能很大的数据集,我需要相互映射.一个是从Web服务返回的List,一个是DataTable.我需要为列表中的每个项目取ANSI(或ISO)编号,并找到包含该ANSI编号的DataTable行,然后对其进行处理.

由于DataTable.Select非常慢,而且我必须为List中的每个项目执行此操作,因此我尝试了更快的替代方案.请记住,DataTable对象没有数据库.所以我不能利用任何SQL功能或类似的东西.

我认为最快的方法可能是使用KeyValuePair(A:Ansi编号或I:Iso编号)创建一个字典并将其用作密钥.该值将是行的其余部分.创建该字典显然需要一点处理时间,但随后我可以利用字典的极快搜索时间来查找我需要的每一行,然后将这些行添加回表中.因此,在列表的foreach循环中,我只会使用字典而不是O(n)或DataTable.Select所具有的O(1)的复杂性.

令我惊讶的是,字典非常慢.直到我发现使用字符串(只是ANSI编号)而不是KeyValuePair才能明显地提高性能.我的谈话速度提高了数百倍.这有可能在地球上如何?这是我测试的方式:

我生成一个模拟Web服务输出的List.我使用键(字符串或KeyValuePair)和DataRow作为值创建基于该列表的字典.我浏览该列表的foreach循环,并在我的字典中搜索该列表中的每个项目,然后为返回的DataRow分配一个值.而已.

如果我使用KeyValuePair作为访问字典的密钥,则需要几秒钟来处理1,000个项目,如果我修改字典只将字符串作为密钥,则10,000个项目需要几毫秒.仅供参考:我设计了测试以便始终存在命中,因此始终可以找到所有键.

这是我正在测量时间的代码块:

foreach(ProductList.Products item in pList.Output.Products)
{
   //KeyValuePair<string, string> kv = new KeyValuePair<string, string>("A", item.Ansi);
   DataRow row = dict[item.Ansi];
   for (int i = 0; i < 10; i++)
   {
      row["Material"] = item.Material + "a"; //Do stuff just for debugging
   }
   hits++;
}
Run Code Online (Sandbox Code Playgroud)

那么,如果我使用Dictionary(KeyValuePair,DataRow)而不是Dictionary(String,DataRow),那么地球上的执行时间可能会突然变长几百倍?

.net c# dictionary

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

标签 统计

c# ×6

dictionary ×4

.net ×2

gethashcode ×1

hash ×1

hashtable ×1

java ×1