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

本文关键字:索引 访问 OrderedDictionary 是否 我怎么知道 | 更新日期: 2023-09-27 18:34:52

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

所以,我

想知道当我已经拥有密钥时,我什么时候会遇到任何要求我通过索引访问值的情况。我在下面有一个小片段。

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

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

非常感谢!

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

我想知道什么时候/会不会遇到任何情况,要求我在已经拥有密钥时通过索引访问值

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

因此,您"可能"遇到的情况是需要按键顺序访问值。 在这种情况下,您需要确定这样做的频率是否足以保证OrderedDictionary开销,或者是否可以仅使用 Linq 查询对结构外部的项进行排序。

基于哈希的集合理论

在 Dictionary 和 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.