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
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...
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
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
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
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
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....
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