我在 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/