4

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

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

4

5 回答 5

4

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

您可能想查看一些现有的基于键的集合,例如SortedList<,>,它的作用类似于Dictionary<,>,但允许使用键和位置索引器。

此外 - 您应该能够对大部分此类事情使用继承 - 例如,从Collection<>or继承List<>。请注意,如果您的集合实现IList/ IList<T>,我不推荐以下(我偶尔会看到):

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

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

于 2008-11-18T10:06:59.863 回答
3

What is the best data structure in .NET for lookup 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);
    }
 }
于 2008-11-18T14:55:41.620 回答
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
于 2008-11-18T10:05:01.177 回答
1
public object this[int index]
{
    get { ... }
    set { ... }
}

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

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

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

于 2008-11-18T09:55:53.753 回答
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 中快速添加。

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

于 2008-11-18T09:54:27.767 回答