所以我遇到了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将提供更快的访问速度。
例如,假设您有一个客户列表。每个客户都包含详细信息,例如姓名和地址以及唯一的客户编号。假设您还有要处理的订单的列表。每个订单将包含正在制作的详细信息,并且需要包括订购者的客户编号。
准备好发货时,您需要找到要发货的地址。如果将客户存储为纯列表,则需要搜索整个列表以找到具有正确客户编号的客户。相反,您可以将客户存储在字典中,并以客户编号为键。现在,该词典将使您无需任何搜索即可一步一步拉出正确的客户。