我一直在使用Dictionary存储键/值对,直到遇到这个名为OrderedDictionary的新类,它有一个通过索引访问数据的附加功能。
所以,我想知道什么时候可以/我会遇到任何会让我通过索引访问价值的情况。我下面有一个小片段。
OrderedDictionary od = new OrderedDictionary();
od.Add("Key1", "Val1");
od.Add("Key2", "Val2");
od.Add("Key3", "Val3");
od.Add("Key4", "Val4");
上面的代码可能看起来不合适但是,如果有人可以提出更好的答案,我真的很感激。
非常感谢!
答案 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.