问题
必须遍历所有 C# Dictionary
元素只能通过 foreach
完成,如果是,为什么?
或者,我可以这样问我的问题:can Dictionary
按 Dictionary
中的位置访问元素对象(即,第一个 元素、最后一个 元素、倒数第三个 元素等)?
这个问题的背景
我正在尝试了解更多关于 Dictionary
的信息对象工作,所以我很感激能帮助我解决这个问题。我正在了解这一点,所以我有几个想法都与这个问题有关。我将尝试以适合 SO 格式的方式呈现。
研究
在 C# 数组中,元素是按位置引用的。在 Dictionary
,值由键引用。
浏览 documentation on MSDN , 有语句
"For purposes of enumeration, each item in the dictionary is treated as a KeyValuePair structure representing a value and its key. The order in which the items are returned is undefined."
因此,似乎由于返回的订单项目未定义,因此无法按位置访问元素。我还阅读了:
"Retrieving a value by using its key is very fast, close to O(1), because the Dictionary class is implemented as a hash table."
查看 HashTable
.NET 4.5 class 的文档, 有引用使用 foreach
循环遍历并返回元素的语句。但是没有提到使用 for
声明,或就此而言 while
或任何其他循环语句。
此外,我注意到了 Dictionary
元素使用 IEnumerable
界面,似乎使用foreach
作为循环函数的唯一语句类型。
想法
那么,这是否意味着 Dictionary
不能像数组或列表那样通过“位置”访问元素?
如果是这样,为什么会有 .Count
返回键/值对数量的属性,但没有任何东西可以让我通过接近总数来引用它们?例如,.Count
是5,为什么我不能请求键/值对.Count
负 1?
如何foreach
能够遍历每个元素,但我无法以相同的方式访问单个元素?
没有办法确定元素(键或值)在 Dictionary
中的位置吗?对象,不使用 foreach
?如果一个键是 Dictionary
中的第一个键,我能否在不将元素映射到集合的情况下判断? , 还是最后一个键?
This SO question优秀的答案涉及到这一点,但我特别想看看我是否必须将元素复制到数组或其他可枚举类型,以按位置访问特定元素。
这是一个例子。请注意,我不是在寻找一种方法来专门解决这个例子——它只是为了说明我的问题。假设我想在 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 += ", ";
}
}
与 Dictionary<string, string>
,我如何将每个 key 复制到 outStr
使用上述方法?看来我必须使用 foreach
.但是什么Dictionary
是否存在可以让我识别元素在字典中的位置的方法或属性?
如果您仍在阅读本文,我还想指出,我并不是要说 Dictionary
有什么错误 ...我只是想了解 .NET 框架中的这个工具是如何工作的,以及我自己如何最好地使用它。
最佳答案
假设您有四辆不同颜色的汽车。而且您希望能够通过颜色快速找到汽车 key 。因此,您制作了 4 个标有“红色”、“蓝色”、“黑色”和“白色”的信封,并将每辆车的 key 放在正确的信封中。哪个是“第一”车?哪个是“第三”?您不关心信封的顺序;您担心能否通过颜色快速获取 key 。
So, does this mean that Dictionary elements cannot be accessed by "position," as arrays or lists can?
不是直接,不是。您可以使用 Skip
和 Take
,但它们所做的只是迭代,直到您到达“第 n 个”项目。
If this is so, why is there a .Count property that returns the number of key/value pairs, yet nothing that lets me reference these by nearness to the total? For example, .Count is 5, why can't I request key/value pair .Count minus 1?
即使没有订单,您仍然可以测量商品的数量。在我的示例中,您知道有 4 个信封,但没有“第三个”信封的概念。
How is foreach able to loop over each element, yet I have no access to individual elements in the same way?
因为 foreach
使用 IEnumerable
,每次只询问“下一个”元素 - 底层集合决定返回元素的顺序。你可以选择一个一个的信封,但顺序无关紧要。
Is there no way to determine the position of an element (key or value) in a Dictionary object, without utilizing foreach?
您可以通过使用 foreach
并计算在到达您想要的元素之前拥有多少元素来推断它,但是一旦您添加或删除一个项目,位置可能会改变。如果我买了一辆绿色汽车并添加了信封,它会去“订单”的哪个位置?
I'm specifically looking to see if I must copy elements to an array or other enumerable type, to access specific elements by position.
嗯,不,您可以使用 Skip
和 Take
,但是没有办法预测那个位置有什么元素。您可以拿起两个信封,忽略它们,拿起另一个信封并将其称为“第三个”信封,但这又怎样?
关于c# - 字典元素访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777568/