iluxa1810 Asked:2020-01-26 14:34:25 +0000 UTC2020-01-26 14:34:25 +0000 UTC 2020-01-26 14:34:25 +0000 UTC 字典中的组合键 772 假设有一个类有 2 个数字字段。 我想让这两个字段成为字典中的主键。 以后会用这个key来查找2个字典之间的匹配值。 如何做到这一点才不会损失性能? 我有一个将它们存储为字符串的想法,但也许有更好的解决方案? 聚苯乙烯 我使用的词典是因为按键搜索速度很快。 令我惊讶的是,DataTable 结果慢了 =( 20k 行 c# 4 个回答 Voted Grundy 2020-01-26T15:17:50Z2020-01-26T15:17:50Z 有几种方法可以将组合键用于字典(类似于 HashSet) 使用结构。比较结构的规则是比较所有字段的值,而不是对对象的引用。 使用具有重写方法的类Equals,GetHashCode。这将允许您不使用类的所有字段来计算哈希值,而只使用必要的字段。 使用实现IEquatable<T>的类 在创建字典时使用采用IEqualityComparer<T>的构造函数重载 Best Answer Vadim Prokopchuk 2020-01-26T15:22:12Z2020-01-26T15:22:12Z 作为选项之一 您可以使用元组类。例如Dictionary<Tuple<T1,T2>, T3>,其中T1、T2、T3是任意类型的值。InTuple将通过内部值进行比较。 元组覆盖了 GetHashCode 和 Equals 方法 © Grundy 使用结构是因为 结构由所有可用字段进行比较 传递IEqualityComparer<T>给构造函数,其中 T 是键的类型。将使用比较器进行比较。 Mark Shevchenko 2020-07-03T20:36:03Z2020-07-03T20:36:03Z 我从重复问题中引入了代码示例。 Dictionary为了通过键访问元素,类需要将键相互比较。 因此,需要实现比较两个复合键对象的操作,例如实现接口IEquatable<ComplexKey>,重写object.Equalsand方法object.GetHashCode。 Equals实现 IEquatable 并覆盖and的示例GetHashCode: public class ComplexKey : IEquatable<ComplexKey> { private int value1; private string value2; public ComplexKey(int value1, string value2) { this.value1 = value1; this.value2 = value2; } public bool Equals(ComplexKey other) { return EqualityComparer<int>.Default.Equals(value1, other.value1) && EqualityComparer<string>.Default.Equals(value2, other.value2); } public override bool Equals(object other) { if (other is ComplexKey) return Equals((ComplexKey)other); return false; } public override int GetHashCode() { var result = 17; unckecked { result = 31 * result + EqualityComparer<int>.Default.GetHashCode(value1); result = 31 * result + EqualityComparer<string>.Default.GetHashCode(value2); } return result; } } 这些方法Equal只是简单地成对比较复合键的所有值,true只有在类的所有字段都匹配时才返回。 该方法以对 SO投票最多GetHashCode的方式计算哈希值。 Qwertiy 2020-01-26T15:05:15Z2020-01-26T15:05:15Z 可能Tuple适合用作钥匙。
有几种方法可以将组合键用于字典(类似于 HashSet)
使用结构。比较结构的规则是比较所有字段的值,而不是对对象的引用。
使用具有重写方法的类
Equals,GetHashCode。这将允许您不使用类的所有字段来计算哈希值,而只使用必要的字段。使用实现IEquatable<T>的类
在创建字典时使用采用IEqualityComparer<T>的构造函数重载
作为选项之一
您可以使用元组类。例如
Dictionary<Tuple<T1,T2>, T3>,其中T1、T2、T3是任意类型的值。InTuple将通过内部值进行比较。IEqualityComparer<T>给构造函数,其中 T 是键的类型。将使用比较器进行比较。我从重复问题中引入了代码示例。
Dictionary为了通过键访问元素,类需要将键相互比较。因此,需要实现比较两个复合键对象的操作,例如实现接口
IEquatable<ComplexKey>,重写object.Equalsand方法object.GetHashCode。Equals实现 IEquatable 并覆盖and的示例GetHashCode:这些方法
Equal只是简单地成对比较复合键的所有值,true只有在类的所有字段都匹配时才返回。该方法以对 SO投票最多
GetHashCode的方式计算哈希值。可能
Tuple适合用作钥匙。