3

重複の可能性:
C# の双方向の 1 対 1 ディクショナリ

次のような1対1の関係を表すことができる標準の.netライブラリにデータ構造が存在するかどうか、私は興味があります

1-a
4-b
6-c
5-d

私が言える場所:

thisstructure[1] // returns "a"
thisstructure.GetKey["d"] // return 5

すべてのキーが一意でなければならないことは理解していますが、似たようなものはありますか?

ありがとう!

4

3 に答える 3

4

はい、それはKeyedCollectionと呼ばれます。これはサブクラス化されることを意図しており、インデックス付きアクセスと、追加された項目から派生したプロパティによるアクセスを提供します。私は通常、汎用サブクラスを作成します。

public class GenericKeyedCollection<TKey, TValue> : KeyedCollection<TKey, TValue> {

    private readonly Func<TValue, TKey> _keyGenerator;

    public GenericKeyedCollection(Func<TValue, TKey> keyGenerator) {
        _keyGenerator = keyGenerator;
    }

    protected override int GetKeyForItem(TValue item)
   {
      return _keyGenerator(item);
   }
}

使用するには:

var myCollection = new GenericKeyedCollection<String, Car>(c=>c.Model);
myCollection.Add(new Car("Ford", "Mustang"));
var byIndex = myCollection[0];
var byModel = myCollection["Mustang"];

唯一の注意点は、アイテムが追加された後に派生プロパティ (「キー」) を変更してはならないということです。

キーが値のプロパティでない場合は、 a を使用しTuple<T1, T2>てキーと値を組み合わせることができます。

var myCollection = new GenericKeyedCollection<String, Tuple<String, Car>>(t=>t.Item1);
myCollection.Add(new Tuple<String, Car>("Foo", Car("Ford", "Mustang")));
var byIndexCar = myCollection[0].Item2;
var byItem1Car = myCollection["Foo"].Item2;
于 2012-07-25T19:42:21.083 に答える
1

この方法はあなたのニーズに合っていますか?

public static class Extensions
{
    public static TKey GetKey<TKey, TValue>(this Dictionary<TKey, TValue> dict, TValue value)
    {
        int index = dict.Values.ToList().IndexOf(value);

        if (index == -1)
        {
            return default(TKey); //or maybe throw an exception
        }

        return dict.Keys.ToList()[index];
    }
}

その後、次のように使用できます。

Dictionary<int, char> dict = new Dictionary<int, char>();
dict.Add(1, 'a');
dict.Add(4, 'b');
dict.Add(6, 'c');
dict.Add(5, 'd');

Console.WriteLine(dict.GetKey('d')); //5
于 2012-07-25T19:53:55.917 に答える
1

Dictionary....orインターフェイスは、IDictionaryあなたが望むものに私が考えることができる最も近いものです。値を検索するとキーが返されるという点で、それほど単純な検索操作はありませんが、キーを検索して値を取得できることは知っています。カスタム拡張クラスで逆の機能を提供することはまったく難しくありません。

MSDN IDictionary ページ

于 2012-07-25T19:42:28.347 に答える