我应该使用哪些泛型

本文关键字:泛型 我应该 | 更新日期: 2023-09-27 17:56:51

我需要存储int - string键值对的列表,并要求保留添加项目的顺序。一旦初始化,它就不会改变,即没有添加或删除任何内容。

起初我想使用Dictionary<int,string>,每次我需要访问项目时都使用

foreach(var entry in dict.OrderBy(e=>e.Key)) { } //as Key is `int`

但是,每次订购似乎都不是最佳选择。

现在我想到了一个主意,只要List<T>保证项目的顺序,就有一个List<Tuple<int, string>>

那么,有没有更好的选择呢?

我应该使用哪些泛型

看看提出的可能性:

  • Dictionary不保证项目的顺序
  • SortedDictionary对项目进行排序,但不按您添加它们的顺序排序(它根据键比较进行排序),
  • OrderedDictionary保持秩序,但它不是通用的,会引入不必要的铸造和拳击。

所以我认为你应该使用List<Tuple<int, string>>.它保留了顺序,并且足以使用foreach和索引访问进行迭代。如果你事先知道大小,你也可以使用数组,或者只读集合类型,正如Cuong Le在他的回答中建议的那样。

如果允许重复键,List<Tuple<int, string>>将是最佳选择。为了使您的列表成为只读,您可以在初始化后公开只读列表:

 var readonlyList = new ReadOnlyCollection<Tuple<int, string>>(yourlist);

尽管Dictionary似乎适合作为数据结构,但它不能保证项目的顺序。

列表似乎不正确,因为它不适合您尝试存储的数据结构。

您可以使用保证项目顺序的OrderedDictionary

foreach (DictionaryEntry entry in orderedDictionary)
{
    //...
}