c# - 具有两个键的对象集合

标签 c# collections

想象一下这个场景:我需要操作(添加、搜索和删除)类型为 Book 的对象列表中的项目。 .

class Book{
 int Id {get; set;}
 string Title {get; set;}
 string Author {get; set;}
 int Year {get; set;}
 // more properties
}

限制者:

  • IdBooks 的集合中应该是唯一的
  • TitleBooks 的集合中应该是唯一的

到目前为止,我有一个 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/

相关文章:

java - Java 中两个 Map<Long, Integer> 之间是否至少存在差异的可读方式?

java - 对 CopyOnArrayList 执行排序操作会导致 java.lang.UnsupportedOperationException

c# - Azure函数无法读取应用程序设置和连接字符串

java - C# 多维数组与 Java 多维数组

c# - 如果我快速连续运行多个 Azure 搜索索引器,是否有办法访问 Azure SDK 中的等待索引器队列?

scala - Scala排序是否稳定?

c# - LINQ 到 SQL : Grouping and limiting a record set

c# - 为什么我的类(class)将一个集合保存到数据库而不是另一个?

c# - Winforms绑定(bind)问题

c# - 有人可以告诉我 List、Collection 和 Enumerable 之间有什么区别?