KeyValuePair mit mehreren Values



  • Ich möchte einen Key mehrere Values zuweisen um schnell darauf zugreifen zu können. Dictionary machts ja problemlos möglich. Nur stellt sich mir die Frage wie ich das Value am günstigsten Gestalte:

    private class MyValueAsClass
    {
      public MyType value1;
      public MyType value2;
      public MyType value3;
    }
    private Dictionary<string, MyValueAsClass> MyDictionary;
    //oder
    private struct MyValueAsStruct
    {
      public MyType value1;
      public MyType value2;
      public MyType value3;
    }
    private Dictionary<string, MyValueAsStruct> MyDictionary;
    

    Variante 1 wiederspricht mir denn Sinn von Klassen. Besser wäre es wohl dann value1 - 3 als private zu machen und dann mit Properties drauf zuzugreifen, was meines erachtens wieder unnötiger Ballast wäre. Der Vorteil ist halt der das man beim Zugriff per TryGetValue gleich eine Referenz bekommt, somit spart man etwas speicher da das kopieren nicht nötig ist. Bei Variante 2 ist das Struct recht Schlank. Direkter zugriff auf die Member erachte ich dort nicht so schlimm, aber irgendwie schmeckt es mir dort nicht jedesmal beim TryGet neuen Speicher zu belegen.
    Die paar Bytes an Speicher würden mir bei der Struct-Lösung nicht weh tun, ich frage mich eher obs dafür ggf noch andere Meinungen gibt die für oder gegen eine der beiden Lösungen sprechen.
    Als Randbedingung gilt noch: Ich will die Werte nur aufbewahren. Es soll nie etwas geändert werden. Dann würde ich je nach Fall ohnehin class nehmen da ich dort direkt die Referenz ändern könnte, oder wenn das ändern nicht direkt ins Dictionary geschrieben werden sollte, müsste ich halt struct nehmen.



  • Bei der Frage class vs. struct beachte ich in .NET fast nur den Aspekt: Brauche ich Referenz- oder Wertsemantik? Und dann entscheidet es sich aller Regel nach für class 😉 structs machen meistens mehr Arbeit, wenn man sie für mehr benutzt als reine POD-Speicher.
    Ich denke ich würde das so machen:

    private class MyValueAsClass {
            public MyType value1 {
                get;
                private set;
            }
    
            public MyType value2 {
                get;
                private set;
            }
    
            public MyType value3 {
                get;
                private set;
            }
    
            public MyValueAsClass(MyType val1, MyType val2, MyType val3) {
                this.value1 = val1;
                this.value2 = val2;
                this.value3 = val3;
            }
        }
    

Anmelden zum Antworten