可通过索引和密钥访问的内置列表

时间:2008-11-18 09:47:16

标签: c# dictionary list

是否可以创建一个可以通过索引或密钥访问的列表?

我正在寻找已经存在的Collection类型但具有此功能,我想避免重新定义索引器

5 个答案:

答案 0 :(得分:4)

现有答案已经显示了如何添加自己的索引器。

您可能希望查看一些现有的基于密钥的集合,例如SortedList<,>,其行为与Dictionary<,>类似,但允许使用键和位置索引器。

此外 - 您应该能够继承大部分类型的东西 - 例如,继承自Collection<>List<>。请注意,如果您的收藏集实施IList / IList<T>,我建议不要使用以下内容(我偶尔会看到):

public SomeType this[int someId] {...}

关键是,人们期望IList[<T>]的整数索引器是位置的。

答案 1 :(得分:2)

System.Collections.Specialized.NameValueCollection可以执行此操作,但它只能将字符串存储为值。

    System.Collections.Specialized.NameValueCollection k = 
        new System.Collections.Specialized.NameValueCollection();

    k.Add("B", "Brown");
    k.Add("G", "Green");

    Console.WriteLine(k[0]);    // Writes Brown
    Console.WriteLine(k["G"]);  // Writes Green

答案 2 :(得分:2)

What is the best data structure in .NET for look-up by string key or numeric index?处有一个类似的问题。

查看KeyedCollection

class IndexableDictionary<TKey, TItem> : KeyedCollection<TKey, TItem>
 { Dictionary<TItem, TKey> keys = new Dictionary<TItem, TKey>();

   protected override TKey GetKeyForItem(TItem item) { return keys[item];}

   public void Add(TKey key, TItem item) 
    { keys[item] = key;
      this.Add(item);
    }
 }

答案 3 :(得分:1)

public object this[int index]
{
    get { ... }
    set { ... }
}

除了只做一个整数索引,你可以提供你喜欢的任何其他类型的键

public object this[String key]
{
    get { ... }
    set { ... }
}

如果您不想定义自己的集合,只需从List<T>继承,或者只使用List<T>类型的变量。

答案 4 :(得分:0)

您可以通过将以下属性添加到集合中来添加索引器:

public object this[int index]
{
    get { /* return the specified index here */ }
    set { /* set the specified index to value here */ }
}

可以通过键入 indexer 并按[tab] [tab]在Visual Studio中快速添加。

可以改变返回类型和索引器类型。您还可以添加多个索引器类型。