【问题标题】:Retrieve dictionary item by number按数字检索字典项
【发布时间】:2012-06-15 12:53:31
【问题描述】:

我有一个Dictionary,其中键和值都是字符串。可以使用[] 获取键的值。但是[] 需要一个字符串。是否可以通过使用数字而不是String键来获取键的值?

Dictionary<String, String> m_GermanEnglish = new Dictionary<String, String>();
m_GermanEnglish.Add("der", "the");

【问题讨论】:

  • 为什么要这样做?如果您想将索引转换为值,则感觉您一定做错了...

标签: c# string dictionary key


【解决方案1】:

使用 System.Linq 命名空间中的扩展函数,您可以执行以下操作:

var indexedDictionary = m_GermanEnglish.ToArray();
var pairAt0 = indexedDictionary[0];

您也可以使用.ToList 扩展函数代替.ToArray。它们都返回KeyValuePair&lt;TKey, TValue&gt; 对象的集合。

注意:字典中的条目可能不一定按照它们放入的顺序排序。

如果您需要保持字典中键/值对的特定顺序,最好使用SortedDictionarySortedList。在我的测试中,SortedList 在查找和按键索引方面往往快 2 倍左右,但 SortedDictionary 在删除条目时要快 100 倍左右。

【讨论】:

  • 这是次优的,因为您不知道结果数组将如何排列,并且排列它需要额外的(相对较慢的)调用。
  • 我也只是记住了这一点,并确保它包含在答案中。
【解决方案2】:

IDictionary 接口在枚举字典时不保证项目的顺序,字典本质上是无序的。因此,不存在“位置 1 的项目”之类的东西,因为集合是无序的。

每次枚举字典时,项目以不同的顺序出现是有效的。

如果您还需要按索引访问项目,那么您需要不同的数据结构,例如 IOrderedDictionary 实现。有一个here 基本上与字典并排保存一个列表以提供按索引访问。

【讨论】:

    【解决方案3】:

    您不能按序数索引字典,因为项目没有明显意义上的序数,它只会将键作为索引公开。字典也不保证顺序。添加一个键或删除一个键,不确定该键将在“记忆位置”方面落到哪里。

    如果您想通过序数索引获取内容,那么我猜您需要一个不同的集合,而不是 Dictionary&lt;&gt;

    也许是List&lt;Tuple&lt;string, string&gt;&gt;?显然,这不会提供任何重复的支持,但它可以让您配对项目并为您提供索引。

    【讨论】:

    • 语义上正确。但是,在 foreach 中简单地枚举字典以将其公开为一组 KeyValuePair&lt;string, string&gt; 元素将很容易。
    • @Tejs 确实,但这涉及了解需要将项目索引出来的“原因”。
    • @Tejs 是的,但不能保证项目与输入的顺序相同,因此对它们进行索引将毫无意义。
    【解决方案4】:

    字典中项的顺序未定义:http://msdn.microsoft.com/en-us/library/ekcfxy3x.aspx即values集合的顺序只保证与键的顺序相同,但字典保留更改它们的权利。

    其他选项: 您可以查看旧的 NameObjectCollection——它可以满足您的要求,但它早于泛型,因此它只是一个对象字典(如果您使用反射器查看 NameObjectCollection,您会看到它们做了同样的事情——他们确实实现了 2 个集合,一个 HashTable 和一个 List)。

    您可以只将它们存储在一个列表中,并使用 LINQ 进行搜索,但这是否是一个好的解决方案取决于您需要存储多少项目(字典查找是 O(1),列表搜索将是 O( n) 充其量。

    【讨论】:

      【解决方案5】:

      可以使用 LINQ

      m_GermanEnglish.ElementAt(index);
      

      但是您依赖的实施是您不知道或没有保证的。字典不保证元素按一定顺序排列。

      【讨论】:

      • +1 虽然这可能永远有效,但没有什么可以阻止将来更改实现并导致使用它的代码以可怕的方式中断。您已收到警告。
      猜你喜欢
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多