c# - 字典元素访问

标签 c# .net

问题

必须遍历所有 C# Dictionary元素只能通过 foreach 完成,如果是,为什么?

或者,我可以这样问我的问题:can DictionaryDictionary 中的位置访问元素对象(即,第一个 元素、最后一个 元素、倒数第三个 元素等)?

这个问题的背景

我正在尝试了解更多关于 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?

不是直接,不是。您可以使用 SkipTake,但它们所做的只是迭代,直到您到达“第 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.

嗯,不,您可以使用 SkipTake,但是没有办法预测那个位置有什么元素。您可以拿起两个信封,忽略它们,拿起另一个信封并将其称为“第三个”信封,但这又怎样?

关于c# - 字典元素访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777568/

相关文章:

c# - 在对象 C# 中查找值的最佳方法

c# - 检查用户是否是组的成员

.net - SHA256Managed 在 x64 构建中的速度是原来的两倍——这是典型的吗?

c# - 点混淆器(.NET 混淆器)是否会在未安装混淆器的机器上引起问题?

c# - 使用泛型解析json模型的转换器

c# - 存储库和服务层交互问题

c# - AvalonDock(2.0) + MVVM + VSPackage = 文档选择麻烦?

c# - 从 C# 中的 .resx 文件读取字符串

.net - 我可以根据 XML 模式验证 XPath 表达式吗?

c# - 从数据库中获取数据并将其导出到 .csv 文件