Dictionary mit 2 (alternativ) Key



  • Guten Morgen Leute,

    ich möchte eine Dictionary dessen Value über 2 alternative Keys ermittelt werden kann.

    Pseudo:

    MyMagicDictionary dict = new MyMagicDictionary ();
    
    dict.Add(keyA:"A", KeyB:1, Value:"Foo");
    dict.Add(keyA:"B", KeyB:2, Value:"Bar");
    
    dict["A"] == "Foo";
    dict[1] == "Foo";
    
    dict["B"] == "Bar";
    dict[2] == "Bar";
    

    etc.

    Nun ja ich habe natürlich gegooglet, und Lösungen mit internen "doppelten" Dictionarys gefunden. Aber vll. gibt es noch ne elegantere Lösung!?

    vll. ein (Gedankenspiel)

    struct MyKey
    {
      public int A{get; set;}
      public string B{get; set;}
    
    public static bool operator ==(MyKey obj1, MyKey obj2)
        {
    return obj1.A == obj2.A || obj1.B == obj2.B;
    }
    public static bool operator !=(MyKey obj1, MyKey obj2)
        {
            return !(obj1 == obj2);
        }
    }
    

    aber der Obj. HashCode hat ehr eine relevant bei Dictionary's?

    was meint Ihr?


  • Mod

    Wird nicht funktionieren. Um Sachen in einer Datenstruktur wiederzufinden (losgelöst von C#, sondern ganz allgemein, weil Computer in egal welcher Sprache nicht zaubern können), gibt es zwei Hauptstrategien, um es effizient zu machen:

    1. Man kategorisiert Daten nach ihrem Inhalt (z.B. nach ihren Hashes), und kann so mittels des Inhalts gezielt an der richtigen Stelle gucken
    2. Man sortiert die Daten, und kann so durch Vergleiche schnell die richtige Stelle finden

    Voraussetzung für 1. ist, dass Objekte, die "gleich" sind, auch denselben Inhalt/Hash haben. Sonst guckt man an der falschen Stelle. Geht also nicht mit deiner Idee.
    Voraussetzung für 2. ist, dass genau dann wenn a==b weder a<b noch b<a gilt, sonst findet man Dinge nie wieder. Wirst du auch nie hinbekommen mit deinem Ansatz.

    Somit verbliebe als Wiederfindungsmethode bei deinem Ansatz nur ein Vergleich mit allen Daten, bis man das gesuchte findet. Und das ist selbst mit Computern viel zu ineffizient für mehr als ein paar hundert Elemente. Und da ist dann eine Alternativlösung mit zwei Dictionarys viel besser, selbst wenn du dafür etwas Arbeit reinstecken musst.



  • Es gibt noch boost MultiIndex, das die Daten vielleicht/angeblich etwas effizienter im Vergleich zu zwei Dictionaries speichert. Hatte ich schon verwendet, aber ich hatte mich mit der internen Darstellung nicht im Detail auseinandergesetzt. Viel kann man da aber sicher nicht rausholen.



  • @Mechanics sagte in Dictionary mit 2 (alternativ) Key:

    boost MultiIndex

    Für C#? 😉

    @SoIntMan
    Mach einfach 2 Dictionaries.



  • Guter Punkt, hab nicht drauf geachtet.
    Hab mal kurz gegoogelt, gab wohl schon paar Versuche, die in die Richtung gehen, schaut mir auf den ersten Blick aber sehr fragwürdig aus.



  • @SeppJ sagte in Dictionary mit 2 (alternativ) Key:

    Wird nicht funktionieren. Um Sachen in einer Datenstruktur wiederzufinden (losgelöst von C#, sondern ganz allgemein, weil Computer in egal welcher Sprache nicht zaubern können), gibt es zwei Hauptstrategien, um es effizient zu machen:

    Man kategorisiert Daten nach ihrem Inhalt (z.B. nach ihren Hashes), und kann so mittels des Inhalts gezielt an der richtigen Stelle gucken
    Man sortiert die Daten, und kann so durch Vergleiche schnell die richtige Stelle finden

    Voraussetzung für 1. ist, dass Objekte, die "gleich" sind, auch denselben Inhalt/Hash haben. Sonst guckt man an der falschen Stelle. Geht also nicht mit deiner Idee.
    Voraussetzung für 2. ist, dass genau dann wenn a==b weder a<b noch b<a gilt, sonst findet man Dinge nie wieder. Wirst du auch nie hinbekommen mit deinem Ansatz.
    Somit verbliebe als Wiederfindungsmethode bei deinem Ansatz nur ein Vergleich mit allen Daten, bis man das gesuchte findet. Und das ist selbst mit Computern viel zu ineffizient für mehr als ein paar hundert Elemente. Und da ist dann eine Alternativlösung mit zwei Dictionarys viel besser, selbst wenn du dafür etwas Arbeit reinstecken musst.

    jepp.. das hast du absolute recht, habe ich zu schnell gedacht,:) mit dem MyKey struct

    @hustbaer sagte in Dictionary mit 2 (alternativ) Key:

    @SoIntMan
    Mach einfach 2 Dictionaries.

    mach ich 🙂

    danke leute



  • @Mechanics sagte in Dictionary mit 2 (alternativ) Key:

    Guter Punkt, hab nicht drauf geachtet.
    Hab mal kurz gegoogelt, gab wohl schon paar Versuche, die in die Richtung gehen, schaut mir auf den ersten Blick aber sehr fragwürdig aus.

    ja das dachte ich mir auch ,und ich dachte es gibt vll. ne elegantere lösung.. egal;)


Log in to reply