我有一个Dictionary
,其中键和值都是字符串。可以使用[]
获取密钥的值。但是[]
需要一个字符串。是否可以通过使用数字而不是字符串键来获取键的值?
Dictionary<String, String> m_GermanEnglish = new Dictionary<String, String>();
m_GermanEnglish.Add("der", "the");
答案 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>
个对象的集合。
注意:字典中的条目可能不一定按照放入的顺序排序。
如果您需要对字典中的键/值对保持一定的排序,最好使用SortedDictionary或SortedList。在我的测试中,SortedList在查找和按键索引时往往快2倍,但SortedDictionary在删除条目时快了约100倍。