想象一下这个场景:我需要操作(添加、搜索和删除)类型为 Book
的对象列表中的项目。 .
class Book{
int Id {get; set;}
string Title {get; set;}
string Author {get; set;}
int Year {get; set;}
// more properties
}
限制者:
-
Id
在Books
的集合中应该是唯一的 -
Title
在Books
的集合中应该是唯一的
到目前为止,我有一个 Dictionary<int, Book>
有 Id
作为键和 Book
作为一个值。但在这种情况下,如果我想向字典中添加一本新书,我必须遍历所有值以检查 Title
是否存在。是否重复。
我开始考虑创建一个 HashSet
仅用于标题或有第二本词典 Dictionary<string, Book>
有 Title
作为 key 。
有什么建议如何处理这种情况?
编辑:
正如@David 提到的,我忘了说我主要关心的是性能。我想以最快的方式 (O(1)) 按 Id 和 Title 查找对象。
最佳答案
您可以使用元组作为键:
var collection = new Dictionary<Tuple<int, string>, Book> (...);
var key = new Tuple<int, string>(1, "David"); // <<-----------
if(!collection.ContainsKey(key))
collection [key] = new Book(...);
注意 Tuple 有其内置的 Equals()让您的生活更轻松。
更新:
@AustinWBryan 提到使用 ValueTuples(C# 7.0 功能)替换 Tuple,强烈推荐。有关 ValueTuples 的更多信息,请参阅 this link .
关于c# - 具有两个键的对象集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50244346/