我怎么知道我是否应该在 C# 的 OrderedDictionary 中通过索引或键访问值?

How can I know if I should access value by index or key in an OrderedDictionary in C#?

一直以来,我都在使用字典来存储 key/value 对,直到我遇到这个名为 OrderedDictionary 的新 class,它具有通过索引访问数据的附加功能。

所以,我想知道什么时候 could/would 我会 运行 遇到任何情况,如果我已经有了密钥,就会要求我通过索引访问值。我在下面有一个小片段。

        OrderedDictionary od = new OrderedDictionary();

        od.Add("Key1", "Val1");
        od.Add("Key2", "Val2");
        od.Add("Key3", "Val3");
        od.Add("Key4", "Val4");

可能,上面的代码看起来不太合适,但是,如果有人能给出更好的代码来回答问题,我将不胜感激。

非常感谢!

基于哈希的集合理论

在 Dictionary 和 OrderedDictionary 之间做出选择之前,让我们先看看一些集合是如何构建的。

数组
当您现在是您的值的索引时,数组提供时间常数访问。 所以键必须是整数。如果你不知道索引,你必须遍历整个集合来检查你的值是你要找的那个。

词典
字典的目的是在键不是整数时提供对其中任何值的(相对)时间常数访问。然而,由于并不总是有一个完美的哈希函数来从一个值中获取一个整数,因此会存在哈希码冲突,然后当多个值具有相同的哈希码时,将它们添加到一个数组中。并且搜索这些冲突的值会更慢(因为它必须遍历数组)。

OrderedDictionary
OrderedDictionary 是前两个集合之间的一种混合。索引搜索 will/should 是最快的(但是您需要分析以确定这一点)。索引搜索的问题在于,除了特殊情况,你不知道你的值存储在哪个索引中,所以你必须依赖键。这让我想知道,为什么你需要一个 OrderedDictionary ?

正如一条评论所暗示的,我很想知道您对此类集合的用例是什么。大多数时候,您要么知道指数,要么不知道指数,因为它依赖于价值性质。所以你应该使用数组或字典,而不是两者的混合。

两个非常不同的用例:

        KeyValuePair<string, string>[] values = new KeyValuePair<string, string>[4];
        values[0] = new KeyValuePair<string, string>("Key1", "Value1");
        // And so on...
        // Or
        Dictionary<string, Person> persons = new Dictionary<string, Person>();
        var asker = new Person { FirstName = "pradeep", LastName=" pradyumna" }; 
        persons.Add(asker.Key, asker);
        // Later in the code, you cannot know the index of the person without having the person instance.

I wanted to know when could/would I be running into any situation that would ask me to access value through index when I have the key already

我遵循 YAGNI 原则 - 你不需要它。如果您已经知道密钥,那么通过索引访问有什么价值?字典的要点是通过键进行快速查找(通过不扫描整个集合)。使用 OrderedDictionary,查找仍然很快,但插入和更新速度稍慢,因为结构必须保持键和索引同步。另外,当前的框架实现不是通用的,因此您必须进行更多转换,但是那里有很多第 3 方通用实现。 MS 没有创建通用实现这一事实可能会告诉您有关该类型总体价值的一些信息。

所以您 "could" 运行 遇到的情况是需要按键顺序访问值。在这种情况下,您需要决定是否经常这样做以保证 OrderedDictionary 的开销,或者您是否可以只使用 Linq 查询来订购结构之外的项目。