0

我有一个Dictionary键和值都是字符串的地方。可以通过使用来获取键的值[]。但是[]期望一个字符串。是否可以通过使用数字而不是字符串键来获取键的值?

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

5 回答 5

6

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

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

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

于 2012-06-12T15:48:06.850 回答
4

可以使用 LINQ

m_GermanEnglish.ElementAt(index);

但是您依赖于您不知道或无法保证的实现。字典不保证元素按特定顺序排列。

于 2012-06-12T15:48:21.293 回答
3

您不能按序数索引字典,因为项目在明显意义上没有序数,它仅将键公开为索引。字典也不保证顺序。添加密钥或删除密钥,就“内存位置”而言,该密钥将落在何处是不确定的。

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

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

于 2012-06-12T15:44:07.297 回答
2

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

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

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

于 2012-06-12T15:49:25.380 回答
1

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

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

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

注意:字典中的条目可能不一定按照与它们输入的顺序相同的顺序进行排序。

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

于 2012-06-12T15:46:17.613 回答