按编号检索字典项目

时间:2012-06-12 15:42:05

标签: c# string dictionary key

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

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

5 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:4)

可以使用LINQ

m_GermanEnglish.ElementAt(index);

但您依赖于您不了解或无法保证的实施。字典不保证元素按特定顺序排列。

答案 2 :(得分:3)

您无法按顺序索引字典,因为项目在明显意义上没有序数,它只将键作为索引公开。字典也不保证订单。添加密钥或删除密钥,它是 indeterminate ,其中该密钥将以“内存位置”着陆。

如果你想通过序数索引获取东西,那么我猜你需要一个不同的集合,而不是Dictionary<>

也许是List<Tuple<string, string>>?显然,这并没有提供任何重复支持,但它允许您配对项目并为您提供索引。

答案 3 :(得分:2)

字典中项目的顺序是未定义的:http://msdn.microsoft.com/en-us/library/ekcfxy3x.aspx也就是说,值集合的顺序仅保证与键的顺序相同,但Dictionary保留更改它们的权利。

其他选择: 您可以查看旧的NameObjectCollection - 它会按照您的要求进行操作,但它早于泛型,因此它只是对象的字典(如果您使用反射器来查看NameObjectCollection,您将看到它们执行相同的操作 - 他们真正实现了2个集合,一个HashTable和一个List。

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

答案 4 :(得分:1)

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

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

您也可以使用.ToList扩展功能代替.ToArray。它们都返回KeyValuePair<TKey, TValue>个对象的集合。

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

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