繁体   English   中英

在这种情况下,字典是最好的数据结构吗?

[英]Is dictionary the best data structure for this case?

我需要有一个

Dictionary< long, List<Person> > 

人员具有ID和值属性。

我希望能够通过ID获取列表,也希望能够从此集合中轻松找到具有特定ID的人。

Dictionary< long, Dictionary<long, string> >

做到这一点的唯一快速的好方法? 还是在这种情况下要使用另一个更简单或更佳的数据结构?

编辑:另外,如果我只有人的ID,那么查找仍然需要遍历原始字典以获取该值。 谢谢,

我只使用Dictionary<long, List<Person>> (或者也许只是Dictionary<long, IEnumerable<Person>> ),并且在速度是可测量的问题时才更改结构。 然后查找将是:

outerDict[listID].First(p => p.ID == personID);

使用Dictionary<long, Dictionary<long, Person>>一些缺点:

  • 如果一个人的ID发生变化,则需要有意地将其移动到Dictionary的另一个存储桶中(没有框架结构可为您完成此操作)
  • 如果您只是想要一个Person的列表,或者需要通过ID以外的其他属性来查找人员,则该结构只会使遍历内部集合更加困难。

如果这两个都不是问题,那么Dictionary<long, Dictionary<long, Person>>肯定会更快,但是直到您尝试将它们都测量后,您才知道有多快。

根据您的编辑(并假设“人员列表ID”和“人员ID” 永远不会改变 ),另一个选择可能是将所有数据加载到平面列表中,并通过ListID创建查找,并通过PersonID创建字典:

List<Person> people = {load list};
var peopleByListID = people.GroupBy(p => p.ListID).ToLookup();
var peopleByID = people.ToDictionary(p => pID, p => p);

这样,您可以使用最适合您需求的结构。 创建查找和字典会有一些额外的开销,因此,除非您需要不断返回原始源,否则这些将在搜索中提供显着的性能优势。

本质上,您有一本两键字典。 您需要具有两个长值才能访问字典的值。 只需创建一个代表这两个ID值的复合对象即可作为字典的键:

Dictionary<Tuple<long, long>, Person>

通过使用单个扁平化的字典,而不是嵌套的字典,可以防止内存碎片,并限制字典的开销。 如果您想稍微提高可读性,则可以创建自己的自定义对象来表示键(只需确保有效地重写GetHashCodeEquals ),而不必使用Tuple

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM