c# - 复合键字典

标签 c# dictionary

我在 List 中有一些对象,比方说 List<MyClass> MyClass 有几个属性。我想根据 MyClass 的 3 个属性创建列表索引。在这种情况下,2 个属性是 int,一个属性是日期时间。

基本上我希望能够做类似的事情:

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

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

最佳答案

你应该使用元组。它们等同于 CompositeKey 类,但 Equals() 和 GetHashCode() 已经为您实现。

var myClassIndex = new Dictionary<Tuple<int, bool, string>, MyClass>();
//Populate dictionary with items from the List<MyClass> MyClassList
foreach (var myObj in myClassList)
    myClassIndex.Add(Tuple.Create(myObj.MyInt, myObj.MyBool, myObj.MyString), myObj);
MyClass myObj = myClassIndex[Tuple.Create(4, true, "t")];

或者使用 System.Linq

var myClassIndex = myClassList.ToDictionary(myObj => Tuple.Create(myObj.MyInt, myObj.MyBool, myObj.MyString));
MyClass myObj = myClassIndex[Tuple.Create(4, true, "t")];

除非您需要自定义散列的计算,否则使用元组更简单。

如果要在复合键中包含很多属性,元组类型名称可能会变得很长,但是您可以通过创建自己的派生自元组<...>的类来缩短名称。


** 2017 年编辑 **

从 C# 7 开始有一个新选项:值元组。思路是一样的,只是语法不同,更轻量:

类型Tuple<int, bool, string>变成 (int, bool, string) , 和值 Tuple.Create(4, true, "t")变成 (4, true, "t") .

使用值元组,也可以命名元素。请注意,性能略有不同,因此如果它们对您很重要,您可能需要进行一些基准测试。

关于c# - 复合键字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2877660/

相关文章:

C# lambda 未命名参数

c# - IGrouping ElementAt 与方括号运算符

c++ - std::vector 比 std::map 更快的键查找?

python - 来自数据框的任何深度的嵌套字典

python - 如何解决需要更新字典的问题

python - 让字典从 csv 文件中读取有序字典

c# - 使用 LINQ-to-Entities 返回一个对象集合,其中一个对象属性与另一个对象集合中的任何属性匹配

c# - 无法在 asp.net core web API 6.0 中获取环境变量

c# - POST json 字典

python - 使用字典在Python中将列表拆分为两部分