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

时间:2016-02-16 12:59:19

标签: c# dictionary indexing key-value ordereddictionary

我一直在使用Dictionary存储键/值对,直到遇到这个名为OrderedDictionary的新类,它有一个通过索引访问数据的附加功能。

所以,我想知道什么时候可以/我会遇到任何会让我通过索引访问价值的情况。我下面有一个小片段。

        OrderedDictionary od = new OrderedDictionary();

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

上面的代码可能看起来不合适但是,如果有人可以提出更好的答案,我真的很感激。

非常感谢!

2 个答案:

答案 0 :(得分:1)

  

我想知道什么时候可以/我会遇到任何会让我通过索引访问价值的情况

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

因此,您“可能”遇到的情况是需要按密钥顺序访问值。在这种情况下,您需要确定是否经常这样做以保证OrderedDictionary的开销,或者您是否可以使用Linq查询来订购结构之外的项目。

答案 1 :(得分:0)

基于哈希的集合理论

在选择Dictionary和OrderedDictionary之前,让我们看一下如何构建一些集合。

<强>阵列
现在,当您获得值的索引时,数组提供时间常量访问。 所以键必须是整数。如果您不了解索引,则必须遍历完整集合以检查您的值是否是您正在寻找的值。

<强>字典
字典的目的是当key不是整数时,提供对它中任何值的(相对)时间常量访问。但是,由于并不总是有一个完美的哈希函数来从一个值中获取一个整数,因此会产生哈希码的冲突,然后当几个值具有相同的哈希码时,它们会被添加到一个数组中。搜索这些碰撞的值会更慢(因为它必须遍历数组)。

<强> OrderedDictionary
OrderedDictionary是前两个集合之间的混合。索引搜索将/应该是最快的(但是您需要进行分析以确保该点)。索引搜索的问题在于,除了特殊情况之外,您还不知道存储值的索引,因此您必须依赖密钥。这让我想知道,为什么你需要一个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.