是否可以创建一个可以通过索引或键访问的列表?
我正在寻找一个已经存在但具有此功能的 Collection 类型,我想避免重新定义索引器
现有答案已经展示了如何添加您自己的索引器。
您可能想查看一些现有的基于键的集合,例如SortedList<,>
,它的作用类似于Dictionary<,>
,但允许使用键和位置索引器。
此外 - 您应该能够对大部分此类事情使用继承 - 例如,从Collection<>
or继承List<>
。请注意,如果您的集合实现IList
/ IList<T>
,我不推荐以下(我偶尔会看到):
public SomeType this[int someId] {...}
关键是,人们期望 an 的整数索引器IList[<T>]
是位置的。
What is the best data structure in .NET for lookup by string key or numeric index?.
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);
}
}
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
public object this[int index]
{
get { ... }
set { ... }
}
除了只做一个整数索引,您还可以提供您喜欢的任何其他类型的键
public object this[String key]
{
get { ... }
set { ... }
}
如果您不想定义自己的集合,只需继承 from List<T>
,或者只使用 type 的变量List<T>
。
您可以通过将以下属性添加到您的集合来添加索引器:
public object this[int index]
{
get { /* return the specified index here */ }
set { /* set the specified index to value here */ }
}
这可以通过键入indexer并按 [tab] [tab] 在 Visual Studio 中快速添加。
返回类型和索引器类型当然可以更改。您还可以添加多个索引器类型。