4

インデックスまたはキーのいずれかでアクセスできるリストを作成することはできますか?

既に存在するがこの機能を持つコレクション型を探しています。インデクサーの再定義を避けたい

4

5 に答える 5

4

既存の回答には、独自のインデクサーを追加する方法が既に示されています。

などの既存のキーベースのコレクションのいくつかを確認することをお勧めしますSortedList<,>。これは と同様に機能しDictionary<,>ますが、キーと位置のインデクサーを使用できます。

また、このタイプのものの多くに継承を使用できるはずです-たとえば、Collection<>またはから継承しList<>ます。あなたのコレクションがIList/IList<T>を実装している場合、次のことはお勧めしません (私は時々見ます):

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

ポイントは、人々は an の整数インデクサーIList[<T>]が位置的であることを期待しているということです。

于 2008-11-18T10:06:59.863 に答える
3

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);
    }
 }
于 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 { ... }
}

独自のコレクションを定義したくない場合は、 から継承する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 に答える