23 Stimmen

Gibt es eine Alternative zu Dictionary/SortedList, die Duplikate zulässt?

Mögliches Duplikat:
C# Sortierbare Sammlung, die doppelte Schlüssel erlaubt

Grundsätzlich möchte ich ein Wörterbuch mit doppelten Schlüsseln arbeiten, ohne in benutzerdefinierte Comparer-Implementierungen zu gehen. Es gibt eine Idee von:

  Dictionary<key, List<value>>

aber sie hat immer noch einen gewissen Overhead. Ich wünschte, Dictionary hätte "AllowDuplicates".

0 Stimmen

Das habe ich bei meiner Suche nicht gefunden. Ich habe für close gestimmt, danke.

0 Stimmen

14voto

LukeH Punkte 251752

Wenn Sie .NET 3.5 verwenden, dann Nachschlagen ist wahrscheinlich das, was Sie suchen.

5 Stimmen

Es ist schade, dass eine so potenziell nützliche Klasse ein paar Einschränkungen hat. So gibt es beispielsweise keinen öffentlichen Konstruktor oder die Möglichkeit, Elemente hinzuzufügen oder zu entfernen.

2 Stimmen

@Ray, stimme völlig zu. Obwohl ich denke, dass es deshalb Lookup und nicht MultiDictionary heißt, um anzudeuten, dass es sich um eine unveränderliche Nachschlagefunktion handelt und nicht um eine Sammlung, die manipuliert werden kann. Der Vorschlag von OP, ein Dictionary<key, List<value>>, wäre viel flexibler.

0 Stimmen

@Ray: Der beste Konstruktor ist, und ich zitiere MSDN: "Sie können eine Instanz eines Lookup<TKey, TElement> erstellen, indem Sie ToLookup auf ein Objekt aufrufen, das IEnumerable<T> implementiert. "

7voto

Mitch Wheat Punkte 287474

.NET 2.0: PowerCollections enthält die OrderedMultiDictionary .

4voto

thangcao Punkte 1671

Sie können immer noch SortedList verwenden und versuchen, einen eindeutigen Schlüssel zu erstellen, indem Sie Ihren Wert und eine Guid in einer Klasse kombinieren. In diesem Fall müssen Sie die IComparer<NewKey> für Ihren neuen Schlüssel, etwa so:

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;
    }
}

und dann

var mySortedList = new SortedList<MyKey, MyValue>(new MyComparer());

3voto

Ryan Emerle Punkte 14990

Nicht in der Fx < 3.5.. Sie können natürlich eine mit einem Dictionary von IList-Objekten implementieren. Aber dann haben Sie die Kapselung Problem/Verantwortung.

Wenn Sie .NET 3.5 verwenden, benutzen Sie die Nachschlagen Klasse.

0 Stimmen

Es ist nur ein Ersatz für Dictionary , aber nicht für SortedList .

2voto

B08AH Punkte 29

Das funktioniert nicht. Sobald Sie 0 aus dem Vergleicher zurückgeben, wird es "Duplikat" Ausnahme werfen.

Sie brauchen keine Klassen-Kapselung oder irgendetwas, machen Sie einfach einen Komparator, der nicht 0 (gleich) Ergebnis zurückgibt. Hier ist ein Beispiel für int Art des Schlüssels

class MyComparer : IComparer<int>
{

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

5 Stimmen

Beachten Sie, dass dieser Trick den Indexer kaputt macht. Wenn Sie versuchen, einen Wert mit Hilfe des Indexers abzurufen, erhalten Sie eine Ausnahme, weil der Schlüssel nicht gefunden werden konnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X