题
必须循环遍历所有C#Dictionary元素foreach,如果是这样,为什么呢?
或者,我可以问我的问题:可以Dictionary通过Dictionary对象内的位置访问元素(即,第一个元素,最后一个元素,最后一个元素的第三个元素等)?
这个问题的背景
我正在尝试更多地了解Dictionary对象是如何工作的,所以我很感激帮助我解决这个问题.我正在了解这一点,所以我有几个想法都与这个问题联系在一起.我将尝试以适合SO格式的方式呈现.
研究
在C#数组中,元素由position引用.在a中Dictionary,值由键引用.
"为了枚举的目的,字典中的每个项目都被视为表示值及其键的KeyValuePair结构.返回项目的顺序是未定义的."
因此,似乎由于返回的订单项未定义,因此无法按位置访问元素.我也读过:
"使用其键检索值非常快,接近于O(1),因为Dictionary类是作为哈希表实现的."
查看HashTable.NET 4.5类的文档,可以参考使用foreach语句循环并返回元素.但是没有提及使用for语句,或者对于该事项while或任何其他循环语句.
此外,我注意到Dictionary元素使用IEnumerable接口,它似乎foreach用作循环函数的唯一语句类型.
思考
那么,这是否意味着Dictionary元素不能被"位置"访问,因为数组或列表可以?
如果是这样的话,为什么有一个.Count属性可以返回键/值对的数量,但是没有什么可以让我通过接近总数来引用它们?例如,.Count是5,为什么我不能请求键/值对.Count减1?
如何foreach循环遍历每个元素,但我无法以相同的方式访问各个元素?
没有利用,是否无法确定Dictionary对象中元素(键或值)的位置foreach?如果一个键是a中的第一个键Dictionary,或者是最后一个键,我是否可以在没有将元素映射到集合的情况下告诉我?
这个SO问题和优秀的答案触及了这一点,但我特别想看看我是否必须将元素复制到数组或其他可枚举类型,以按位置访问特定元素.
这是一个例子.请注意我并不是在寻找一种专门解决这个例子的方法 - 它仅用于解释我的问题.假设我想将Dictionary<string, string>对象中的所有键添加到以逗号分隔的列表中,最后没有逗号.有了我可以做的数组:
string[] arrayStr = new string[2] { "Test1", "Test2" };
string outStr = "";
for (int i = 0; i < arrayStr.Length; i++)
{
outStr += arrayStr[i];
if (i < arrayStr.Length - 1)
{
outStr += ", ";
}
}
Run Code Online (Sandbox Code Playgroud)
有Dictionary<string, string>,我如何outStr使用上述方法复制每个键?看来我必须使用foreach.但是Dictionary存在哪些方法或属性可以让我在字典中识别元素所在的位置?
如果你还在读这篇文章,我也想指出,我不是说有什么东西错用Dictionary......我只是想了解这个工具在.NET框架是如何工作的,以及如何最好地利用我自己.
假设您有四辆不同颜色的汽车.而且你希望能够通过它的颜色快速找到汽车的钥匙.因此,您将4个信封标记为"红色","蓝色","黑色"和"白色",并将钥匙放在右侧信封中的每辆车上.哪个是"第一"车?哪个是"第三个"?你不关心信封的顺序; 你担心能够通过颜色快速获得钥匙.
那么,这是否意味着"位置"无法访问"词典"元素,因为数组或列表可以?
不直接,没有.您可以使用Skip,Take但他们所做的只是迭代,直到您到达"第n"项.
如果是这样,为什么有.Count属性返回键/值对的数量,但是没有什么可以让我通过接近总数来引用这些?例如,.Count为5,为什么我不能请求键/值对.Count减去1?
即使没有订单,您仍然可以测量项目数量.在我的例子中,你知道有4个信封,但没有"第三"信封的概念.
foreach如何循环遍历每个元素,但我无法以相同的方式访问各个元素?
因为foreachuse IEnumerable,每次只询问"next"元素 - 底层集合决定元素的返回顺序.你可以逐个拿起信封,但顺序无关紧要.
如果不使用foreach,是否无法确定Dictionary对象中元素(键或值)的位置?
您可以通过使用和计算到达所需数量之前的元素来推断它foreach,但是一旦添加或删除项目,该位置可能会发生变化.如果我买一辆绿色汽车并添加信封,那么"订单"会在哪里?
我特别想查看是否必须将元素复制到数组或其他可枚举类型,以按位置访问特定元素.
好吧,不,你可以使用Skip和Take,但没有办法预测那个位置的项目.您可以拿起两个信封,忽略它们,拿起另一个信封并称之为"第三个"信封,但那又怎么样?