具有重复的元组的平面列表“;键”;vs列表字典C#

本文关键字:列表 vs 字典 元组 平面 | 更新日期: 2024-09-24 02:20:54

从配置读取映射数据时,系统可以使用一个或多个类型(而不是.NET类型)

例如:

  • SystemAlpha消耗TypeA

  • SystemBeta消耗类型A

  • SystemBeta消耗TypeB

这可以作为system, type对存储在类型为List<Tuple<string, string>>的平面列表中,这将非常容易使用LINQ进行查询。查询哪些类型被哪些系统使用在这里也是可行的,这是一个好处。如果每个系统使用一种以上的类型(即重复的"密钥"),则会有多个条目。缺点是这里的查找速度是O(n)(可以使用O(log(n))的排序列表)

而对于Dictionary<string, List<string>>,每个系统将有一个带有已消费类型列表的条目。CCD_ 6查找,但缺点是不能容易地查询哪些系统使用特定类型。

映射将足够小(可能),在最坏的情况下可以使用O(n),并且有足够的内存(就字典开销而言)。

所以我要问的是:

  1. 哪一个是最可扩展和可重复使用的?(可能最终是一个大型映射)
  2. 从代码阅读的角度来看,哪一个对以后的人来说最容易阅读/使用
  3. 我是不是想得太多了

(MultiValueDictionary尚未完全发布)

具有重复的元组的平面列表“;键”;vs列表字典C#

我会选择Dictionary<TKey, List<TValue>>。它为以后阅读代码的人提供了更清晰的信息。

如果您真的需要按值查找,您可以使用另一个Dictionary<TKey, List<TValue>>,它将保存opsite方向的引用。将它们封装在一个类中,使它们保持同步,这样可以很容易地确保无论何时发生更改,两个集合都会反映更改。

如果项目数量很小,您可以跳过第二个集合,进行线性查找以确定哪些系统使用特定类型:

return dict.SelectMany(x => x.Value.Select(y => new { x.Key, Value = y })
           .Where(x => x.Value == typeToSearch)
           .Select(x => x.Key);

首先,从某种意义上说,这种比较是不公平的,因为这两种数据结构对可以存储的数据没有相同的限制:元组的平面列表允许任何数量的重复"键",而dictionary则不允许。这个限制很重要:代码的人类读者将从Dictionary<K,V>中读取这个含义,而不是从List<Tuple<K,V>>中读取。

作为一名设计师,向人类读者传达你的意图是最重要的任务之一,因此使用Dictionary<K,V>是一个更好的选择。除此之外,您在帖子中列出的优点也适用:随着映射大小的增加,恒定时间查找将变得更加重要。