インデックスまたはキーのいずれかでアクセスできるリストを作成することはできますか?
既に存在するがこの機能を持つコレクション型を探しています。インデクサーの再定義を避けたい
インデックスまたはキーのいずれかでアクセスできるリストを作成することはできますか?
既に存在するがこの機能を持つコレクション型を探しています。インデクサーの再定義を避けたい
既存の回答には、独自のインデクサーを追加する方法が既に示されています。
などの既存のキーベースのコレクションのいくつかを確認することをお勧めしますSortedList<,>
。これは と同様に機能しDictionary<,>
ますが、キーと位置のインデクサーを使用できます。
また、このタイプのものの多くに継承を使用できるはずです-たとえば、Collection<>
またはから継承しList<>
ます。あなたのコレクションがIList
/IList<T>
を実装している場合、次のことはお勧めしません (私は時々見ます):
public SomeType this[int someId] {...}
ポイントは、人々は an の整数インデクサーIList[<T>]
が位置的であることを期待しているということです。
There's a similar question at What is the best data structure in .NET for look-up by string key or numeric index?.
Have a look at 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);
}
}
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 { ... }
}
独自のコレクションを定義したくない場合は、 から継承する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 にすばやく追加できます。
もちろん、戻り値の型とインデクサーの型は変更できます。複数のインデクサー タイプを追加することもできます。