![]() |
1
92
你应该使用元组。它们等价于compositekey类,但是equals()和gethashcode()已经为您实现。
或使用System.Linq
除非需要自定义哈希的计算,否则使用元组更简单。 如果您希望在复合键中包含许多属性,则元组类型名称可能会变得相当长,但您可以通过创建从元组派生的类来缩短名称。 ** 2017编辑 ** 有一个新的选择,从C 7开始: 值元组 . 想法相同,但语法不同,更轻:
类型
对于值元组,也可以命名元素。请注意,性能略有不同,因此如果它们对您很重要,您可能需要进行一些基准测试。 |
![]() |
2
21
我能想到的最好方法是创建一个复合键结构和 确保 要重写getHashCode()和equals()方法,以确保使用集合时的速度和准确性,请执行以下操作:
有关getHashCode()的msdn文章: http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx |
![]() |
3
13
怎么样
这将允许您执行以下操作:
|
![]() |
4
11
您可以将它们存储在结构中,并将其用作键:
获取哈希代码的链接: http://msdn.microsoft.com/en-us/library/system.valuetype.gethashcode.aspx |
![]() |
5
5
既然VS2017/C_7已经出现,最好的答案是使用valuetuple:
我选择用匿名值元组声明字典
在性能上,新的valuetuple比tuple更快
|
![]() |
6
4
立刻想到两种方法:
*关于是否重写
|
![]() |
7
3
如果键是类的一部分,则使用keyedcollection。
用于公开复合键的索引器
对于使用值类型fpr,Microsoft特别推荐使用该键。 从技术上讲,tuple不是值类型,但具有相同的症状(哈希冲突),不适合作为键的候选者。 |
![]() |
8
2
我可以推荐一个替代方案吗?匿名对象。我们在groupby-linq方法中使用多个键也是一样的。
这可能看起来很奇怪,但我已经将tuple.gethashcode和new a=1,b=2.gethashcode方法作为基准,匿名对象在我的.NET 4.5.1计算机上获胜: 对象-891732 ms,在1000个周期内调用10000次 tuple-7384475 ms,用于1000个周期内的10000次呼叫 |
![]() |
9
0
另一个解决方案是存储到目前为止生成的所有键的列表,当生成一个新对象时,生成它的哈希代码(就像一个起点),检查它是否已经在列表中,如果已经在列表中,然后向它添加一些随机值等,直到获得一个唯一的键,然后将该键存储在对象中。在列表中,并始终将其作为键返回。 |
![]() |
eymentakak · json字典类型错误:字符串索引必须是整数 2 年前 |
![]() |
Rohan Mittal · 按dict值对dict排序 2 年前 |
![]() |
mars · 将值作为元组对字典进行排序 2 年前 |
![]() |
Sher Meen · 我需要列出一个循环中临时变量中存储的多个值 2 年前 |
![]() |
Shubh · 如何将字典行附加到空数据帧中? 2 年前 |
![]() |
kms · 从pandas中的字典中读取数据并指定新的列值 3 年前 |
![]() |
Alex · 如何向嵌套字典json添加值? 3 年前 |