| 

.NET C# Java Javascript Exception

3
Hallo,

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" });

//Name ermitteln klassisch
if (loKundenDictionary.ContainsKey(lnSuchIndex))
lsName = loKundenDictionary[lnSuchIndex].Name;
else
lsName = LEER;

//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?

Gruß
News:
08.04.2011
PinBack 687 1 8
3 Antworten
7
Wenn es nur um die Schreibweise geht, ist das vielleicht eleganter:
lsName = loKundenDictionary.ContainsKey(lnSuchIndex) ? loKundenDictionary[lnSuchIndex].Name : LEER;


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" });

//Name ermitteln klassisch
lsName = loKundenDictionary.ContainsKey(lnSuchIndex) ? loKundenDictionary[lnSuchIndex].Name : loKundenDictionary[0].Name;


Noch schöner finde ich diese Lösung per extension method:
C# dictionaries ValueorDefault
loKundenDictionary.GetValueOrDefault(42, "default");
08.04.2011
Jürgen Luhr 7,1k 2 9
Coole Sache! +1 von mir!
Thomas Sczyrba 08.04.2011
die idee ist nett +1
nabuchodonossor 08.04.2011
Über Extension Methoden ist halt immer recht schick. Wobei ich für den obigen Einzeiler noch am besten finde.
PinBack 08.04.2011
1
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;
}

private String GetNameByKeyOrDefault(int idx)
{
if (loKundenDictionary.ContainsKey(idx))
return loKundenDictionary[idx].Name;
else
return LEER;
}
}
08.04.2011
chrigl 11 1
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.
PinBack 08.04.2011
0
wie willst du das noch weiter vereinfachen?

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.
08.04.2011
nabuchodonossor 1,3k 5

Stelle deine .net-Frage jetzt!