22

重複の可能性:
重複キーを許可する C# のソート可能なコレクション

基本的に、カスタム比較器の実装に入ることなく、辞書を重複キーで機能させたいと思います。次の考え方があります。

  Dictionary<key, List<value>>

ただし、まだオーバーヘッドがあります。辞書に「AllowDuplicates」があればいいのにと思います。

4

7 に答える 7

14

.NET 3.5 を使用している場合は、おそらくLookupを使用することをお勧めします。

于 2009-02-16T00:24:04.850 に答える
7

.NET 2.0: PowerCollectionsには、OrderedMultiDictionary.

于 2009-02-16T00:23:50.517 に答える
4

引き続き SortedList を使用して、値と Guid をクラスに組み合わせることで一意のキーを作成することができます。この場合、次のIComparer<NewKey>ような新しいキーの を実装する必要があります。

class MyKey
{
    public Guid Guid { get; set; }
    public float Value { get; set; }
}

class MyComparer : IComparer<MyKey>
{

    public int Compare(MyKey x, MyKey y)
    {
        if (x == null || y == null)
            throw new InvalidOperationException("both of parameters must be not null");
        if (x.Value < y.Value) return -1;
        if (x.Value > y.Value) return 1;
        return 0;
    }
}

その後

var mySortedList = new SortedList<MyKey, MyValue>(new MyComparer());
于 2011-10-14T15:00:16.453 に答える
3

Fx < 3.5 にはありません。明らかに、IList オブジェクトの Dictionary を使用して実装できます。しかし、カプセル化の問題/責任があります。

.NET 3.5 を使用している場合は、Lookupクラスを使用します。

于 2009-02-16T00:21:19.460 に答える
2

それはうまくいきません。比較子から 0 を返すとすぐに、「重複」例外がスローされます。

クラスのカプセル化などは必要ありません。0 (等しい) の結果を返さない比較子を作成するだけです。intこれはキーのタイプの例です

class MyComparer : IComparer<int>
{

  public int Compare(int x, int y)
  {
    if (x < y)
      return -1;
    else return 1;
  }
}
于 2011-10-28T13:04:26.310 に答える
0

同じ問題に遭遇しました..重複キーを許可できるsortedListが必要でした..

var sortList = new SortedList<string, IDictionary<string, object>>();

しかし、これは機能しませんでした..だから私は使用しました

var list = new List<KeyValuePair<string, IDictionary<string, object>>>();

新しいデータを .. として追加します。

list.Add(new KeyValuePair<string, IDictionary<string, object>>>(value, Dictionary));

linqで問題なくソートできました..

試すList<KeyValuePair<TKey, List<TValue>>>();

于 2010-11-22T16:41:49.953 に答える
0

定義により、Dictionary には一意のキーが含まれます。上記の例は、事実上、私が何度も使用した構造である、一種の 2 次元のキー付き配列です。なぜ重複したキーが必要なのですか? もしそうなら、ディクショナリはそのメンバーをどのように一意にアドレス指定しますか?

于 2009-02-16T00:22:00.973 に答える