20


0

重複を許可するDictionary / SortedListに代わるものはありますか?

_ 可能な重複: + https://stackoverflow.com/questions/5716423/c-sharp-sortable-collection-which-allows-duplicate-keys [重複キーを許可するC#ソート可能コレクション] _

基本的に、私は、カスタム比較機能の実装に入らずに、重複キーを使ってDictionaryを機能させたいと思います。 のアイデアがあります:

  Dictionary>

それでもまだいくらかのオーバーヘッドがあります。 辞書に "AllowDuplicates"があればいいのに。

7 Answer


13



7


NET 2.0:

http://www.codeplex.com/PowerCollections/Release/ProjectReleases.aspx?ReleaseId=6863 [PowerCollections]には `OrderedMultiDictionary`が含まれています。


4


それでもSortedListを使用して、自分の値とGuidを組み合わせてクラスにすることで一意のキーを作成しようとすることができます。 この場合、新しいキーに `IComparer`を実装する必要があります。

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

class MyComparer : IComparer
{

    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(new MyComparer());


3


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


3


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

クラスのカプセル化などは必要ありません。比較結果が0(等しくない)にならないようにするだけです。 これは `int`型のキーの例です

class MyComparer : IComparer
{

  public int Compare(int x, int y)
  {
    if (x < y)
      return -1;
    else return 1;
  }
}


1


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

var sortList = new SortedList>();

しかしこれはうまくいきませんでした.. だから私は使った

var list = new List>>();

新しいデータを追加する

list.Add(new KeyValuePair>>(value, Dictionary));

LINQと私は問題なくそれを並べ替え..

List >>()を試してください。


0


定義上、辞書には一意のキーが含まれています。 上の例は、事実上一種の二次元キー配列で、私は何度も使ってきた構造です。 なぜあなたは重複キーを持ちたいのでしょうか? もしそうなら、ディクショナリーはどのようにしてそのメンバーをユニークに演説するでしょうか?