ich suche in einem Dictionary eine Klasse anhand eines Keys. Als Ergebnis hätte ich gerne den Wert eines Properties von der Klasse bzw. einen selbst definierte Default-Wert.
Was soll ich lange schreiben hier mal ein vereinfachtes Beispiel:
public class Kunde { public string Name { get; set; } }
public void Test() { const string LEER = "Nicht vorhanden"; int lnSuchIndex = 1; string lsName; Dictionary<int, Kunde> loKundenDictionary = new Dictionary<int, Kunde>(); loKundenDictionary.Add(1, new Kunde() { Name = "Big Lebowski" }); loKundenDictionary.Add(2, new Kunde() { Name = "Tyler Durden" });
//Mithilfe von LINQ lsName = (from kunde in loKundenDictionary where loKundenDictionary.ContainsKey(lnSuchIndex) select kunde.Value.Name).FirstOrDefault() ?? LEER;
}
Ich finde die klassische Variante sogar lesbarer als die LINQ-Geschichte. Was meint ihr? Gibt es noch einen anderen Weg diese Aufgabe "elegant" zu lösen?
Falls du weißt, dass ein bestimmter Key (z.B. 0 oder -1) nicht vorkommt, kannst du den Default ins Dictionary legen:
int lnSuchIndex = 3; string lsName; Dictionary<int, Kunde> loKundenDictionary = new Dictionary<int, Kunde>(); loKundenDictionary.Add(0, new Kunde() { Name = "Nicht vorhanden" }); loKundenDictionary.Add(1, new Kunde() { Name = "Big Lebowski" }); loKundenDictionary.Add(2, new Kunde() { Name = "Tyler Durden" });
Elegant und lesbar wirds, sobald du Codesegmente in Methoden verpackst, und diesen stimmige Namen gibst. Das führt dann auch zum "selbstdokumetierenden Code". Siehe folgendes Beispiel:
public class TheTestClass { private Dictionary<int, Kunde> loKundenDictionary; private const string LEER = "Nicht vorhanden";
public void Test() { int lnSuchIndex = 1; string lsName;
// Ich sehe auf den ersten Blick, was hier passiert. loKundenDictionary = CreateAndInitializeDictionary();
// und ich sehe auch auf den ersten Blick, was hier passiert. lsName = GetNameByKeyOrDefault(lnSuchIndex); }
private Dictionary<int, Kunde> CreateAndInitializeDictionary() { Dictionary<int, Kunde> retValue = new Dictionary<int, Kunde>(); retValue.Add(1, new Kunde() {Name = "Big Lebowski"}); retValue.Add(2, new Kunde() {Name = "Tyler Durden"}); return retValue; }
LINQ hat für mich ja gerade den Charme, dass man für „einfache“ Suchen, Projektionen oder Aggregat-Funktionen nicht jedes Mal gleich eine separate Methode schreiben muss. Das Beispiel dient auch lediglich der Verdeutlichung der Problematik.
was noch ginge, wäre eine klasse von Dictionary abzuleiten, die beim Zugriff auf ein nicht-exisitierendes Element den "Default" zurückgibt .... aber ob das besonders klug ist, wage ich zu bezweifeln.