Laden...

Generics - Auslesen komplexer Values im Dictionary?

Erstellt von tmase vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.596 Views
T
tmase Themenstarter:in
11 Beiträge seit 2010
vor 13 Jahren
Generics - Auslesen komplexer Values im Dictionary?

Liebe Community!

Ich stehe vor einem Problem, dessen Lösung wahrscheinlich nicht zu schwierig ist, jedoch komme ich seit einiger Zeit nicht dahinter.

Und zwar habe ich ein Dictionary, dessen Key den Datentyp string und dessen Value ein struct mit 4 verschiedenen string beinhaltet (Dictionary<string, TestStruct>).
Nun stellt sich bei mir die Frage, wie ich dieses Dictionary auf einen Wert im Valuebereich überprüfen soll, denn mit dem Aufruf:

if(dictionary.ContainsValue("01")

funktioniert es nicht, Fehlermeldung: "cannot convert from string to Teststruct"!

Kann mir hier vielleicht irgendwer helfen?

Lg

916 Beiträge seit 2008
vor 13 Jahren

Die Fehlermeldung ist klar, weil du ein neues TestStruct Element rein stecken musst welches deinem suchKey entspricht. Schau dir auch mal das hier an, das hilft dir im Bezug auf den "internen" Vergleich weiter.

Again what learned...

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo tmase,

sollten eigentlich Grundlagen sein und in [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen) vorhanden sein.

Wenn du in der ContrainsValue(TValue) nachschaust siehst du dass der Parameter der ContrainsValue gleich dem generischen Parameter beim erstellen des Dictionaries ist. Da du als TValue deinen Struct hergenommen hast, so erwartet ContainsValue auch einen Value vom Typ deines Structs. Evtl solltest du im Struct noch die .Equals() und GetHashCode() bzw == und != überschreiben.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

T
tmase Themenstarter:in
11 Beiträge seit 2010
vor 13 Jahren

Danke für die rasche Rückmeldung.
@ rollerfreak:
Gar nicht gewusst dass man struct miteinander vergleichen kann 😁
Das Problem ist nur, dass ich mit diesem Ansatz nicht weit komme, da hier (falls ich den Link richtig verstanden habe) die structs untereinander gleich sein müssen. Ich möchte jedoch nur überprüfen, ob der Wert (zb. "01") in meiner Valuegruppe des Dictionaries enthalten ist.

@Muro:
Ist iwie klar. Ich kann im Prinzip auch diesen Code hernehmen:


Dictionary<string, DataTypes.Test> dict = GenerateDictionary();
DataTypes.Test test = new DataTypes.Test();
test.gwaCode = "01";
 if(dict.ContainsValue(test.gwaCode)) 

Das funktioniert in dem Fall auch nicht, da test.gwaCode wiederum einen String representiert. Wenn ich in der IF-Anweisung den gwaCode weg und nur die Instanz des structs stehen lasse, dann wird der Compiler zwar kein Problem damit haben, jedoch werde ich im Gengezug nie in meine Anweisung kommen.

Aber ich werde mir mal deinen zweiten Ratschlag mit der Methodenüberschreibung zu Gemüte führen, auch wenn ich auf dem Gebiet ein Neuling bin 🙂

Liebe Grüße nach Südtirol 😉

Tmase

1.552 Beiträge seit 2010
vor 13 Jahren

Aber ich werde mir mal deinen zweiten Ratschlag mit der Methodenüberschreibung zu Gemüte führen, auch wenn ich auf dem Gebiet ein Neuling bin

Kein Problem waren wir alle mal.

Es gibt 2 Möglichkeiten, entweder du überschreibst die Equals(object obj) von object oder die Equals(T other) von IEquatable<T>

Verwende dazu folgende Methodensignatur:


public override bool Equals(object obj)
{
    return überprüfungAufGleichheit;
}

oder 2. Möglichkeit


public struct MyFirstStruct : IEquatable<MyFirstStruct>
{ 
    public bool Equals(MyFirstStruct other)
    {
        return überprüfungAufGleichheit;
    }
}

IMO ist zweitere Möglichkeit schöner.

Liebe Grüße nach Südtirol

Gruß zurück
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

das eigentlich Problem ist relativ einfach mit Linq lösbar:

if(dict.Values.Any(val => val.gwaCode == "01"))
{
  // Mindestens einer der Werte (dein Struct) enthält "01" in gwaCode
};

siehe Enumerable.Any<TSource>-Methode

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

T
tmase Themenstarter:in
11 Beiträge seit 2010
vor 13 Jahren

Danke für die Antworten!
Bin echt erstaunt wie schnell das hier geht 👍
Werd mir das ganze mal im neuen Jahr durchsehen...jetzt heißts mal Feierabend!
Schönes neues Jahr....

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo tmase,

allerdings verspielt man den Vorteil des Dictionarys, schelle Zugriffe per Key zu ermöglichen, wenn man eben nicht über den Key, sondern über das Value zugreift. Ein bestimmtes Value findet man in einem Dictionary nicht schneller als in einer normalen Liste.

Beachte bitte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore