所以我遇到了Dictionary<int, int>今天的工作。这对我来说似乎很奇怪,因为我可能会改用a List<int>。有区别吗?是否会有用例,其中一种结构优于另一种结构?
List<T>.NET框架中的a是一个随机访问数组,其中查找操作通常比.NET框架快Dictionary<int,T>。
Dictionary<TKey, TValue>。
所以我遇到了Dictionary<int, int>今天的工作。这对我来说似乎很奇怪,因为我可能会改用a List<int>。有区别吗?是否会有用例,其中一种结构优于另一种结构?
List<T>.NET框架中的a是一个随机访问数组,其中查找操作通常比.NET框架快Dictionary<int,T>。
Dictionary<TKey, TValue>。
Answers:
Dictionary<int, int>如果您的索引除了位置之外还具有特殊含义,则可以使用a 。
我想到的直接示例是在数据库中存储id列和int列。例如,如果您有一[person-id]列和一[personal-pin]列,则可以将它们放入中Dictionary<int, int>。这样可以pinDict[person-id]给您提供PIN码,但是索引是有意义的,而不仅仅是在中的位置List<int>。
但是实际上,任何时候只要有两个相关的整数列表,这都可能是合适的数据结构。
List<int>,而不是字典。请参阅下面的答案。
可以将List视为数组,并将Dictionary视为哈希表。仅在Dictionary需要将有意义的键映射(或关联)到值时使用,而List仅将位置(或索引)映射(或关联)到值。
例如,假设您想存储一个人的年龄与其身高之间的关联。您可以使用Dictionary<int, int>将人的年龄(an int)映射到他们的身高(an int):
Dictionary<int, int> personHeightMap = new Dictionary<int, int>();
personHeightMap.Add(21, 185);
personHeightMap.Add(31, 174);
int height = personHeightMap.ContainsKey(21) ? personHeightMap[21] : -1;
这不是一个非常有用的示例,但要点是,您将无法使用a优雅地完成此操作,List因为它将需要在位置上存储这些值。
List与订单打交道,而Dictionary与关联打交道。如果您每次都需要按一定顺序获取数据,或者它们之间的相对顺序很重要,那么List就可以采用a 。Dictionaries往往是无序的,并处理映射键->值关系。
从语义上讲,Dictionary<int, T>和List<T>是非常相似的,两者都是.NET框架的随机访问容器。要将列表替换为字典,您需要在类型中输入一个特殊值T(例如null),以表示列表中的空位。如果T不是类似的可为空的类型int,则可以int?改用它,或者如果只是希望存储正值,则还可以使用特殊值(如-1)来表示空插槽。
您将选择哪一个取决于键值的范围。如果您的键在Dictionary<int, T>整数区间内,并且它们之间没有太多间隔(例如[0,... 100]中有80个值),则a List<T>会更合适,因为按索引访问会更快,并且在这种情况下,与字典相比,内存和时间开销更少。
如果您的键值是int[0,...,1000000]等范围内的100个值,则一个List<T>内存需要容纳1000000个T值,而您的字典将只需要大约100个T值的数量级的内存, 100个int值(加上一些开销,实际上期望大约是用于存储这100个键和值的内存的2倍)。因此,在后一种情况下,字典将更合适。
List<KeyValuePair<int,T>>,没有可用的O(1)查找操作。其次,中的元素List<KeyValuePair<int,T>>可以具有独立于其键值的特定顺序。如果您需要后者而非前者,List<KeyValuePair<int,T>>或者List<Tuple<int,T>>可能是更好的选择。如果您同时需要两者,则也有OrderedDictionary。
谁能认为它们等效?
字典稀疏并且允许随机插入,但使有序遍历成为一个问题,List不是稀疏且无序插入很昂贵,它固有地提供有序遍历。
在极少数情况下,一个并没有明显优于另一个。
另外:其他编程语言将这种类型的数据结构称为Map,而不是Dictionary。
如果可以将您的数据有意义地定义为键/值对,那么如果您需要使用其键查找值,则Dictionary将提供更快的访问速度。
例如,假设您有一个客户列表。每个客户都包含详细信息,例如姓名和地址以及唯一的客户编号。假设您还有要处理的订单的列表。每个订单将包含正在制作的详细信息,并且需要包括订购者的客户编号。
准备好发货时,您需要找到要发货的地址。如果将客户存储为纯列表,则需要搜索整个列表以找到具有正确客户编号的客户。相反,您可以将客户存储在字典中,并以客户编号为键。现在,该词典将使您无需任何搜索即可一步一步拉出正确的客户。