C#中松散的数字索引列表最适合哪种类型?

时间:2014-01-24 01:57:19

标签: c# .net collections types

我需要的是类似于数组的东西,但让我随时为索引分配一个元素,并检查是否已经为特定索引分配了一个值,如

MyArray<string> a = new MyArray<string>();
a[10] = "ten";
bool isTheFifthElementDefined = a[5] != null; // false

也许Dictionary<int, string>使用ContainsKey方法可以做,但如果我只想要一个带有数字键的有序集合,那么是不是有更合适的数据结构?

我还需要遍历已定义的元素(最好使用foreach或linq)访问当前元素的值和键。

2 个答案:

答案 0 :(得分:2)

正如您所提到的,Dictionary似乎更适合此。但是您可以使用通用列表来执行此操作,例如,在创建列表时,您可以指定元素计数,并且可以提供默认的临时值为你的所有元素。

List<string> myList = new List<string>(Enumerable.Repeat("",5000));
myList[2300] = "bla bla bla..";

int:

List<int> myList = new List<int>(Enumerable.Repeat(0,5000));

custom type

List<MyClass> myList = new List<MyClass>(Enumerable.Repeat(new MyClass(), 100));

Ofcourse这不是最好的解决方案......

注意:如果您想按键排序,也可以使用SortedList代替Dictionary

  

SortedList<TKey, TValue> :表示根据关联的IComparer实现按键排序的键/值对的集合。

答案 1 :(得分:1)

如果您需要键/值对,则无法使用列表,您需要一个词典。 实现非常活泼,所以不要太害怕性能(只要你没有在其中放入过多的值)。

您可以使用

进行迭代
foreach(KeyValuePair<int, string> kvp in dict)
{
}

如果您需要订购,可以使用清单:

List<int> ordered = new List(dict.Keys);
ordered.Sort();

foreach(int key in ordered)
{
}