Entwickler-Ecke
C# - Die Sprache - Frage zu Dictionary
Help_Me - Sa 24.04.10 16:46
Titel: Frage zu Dictionary
Hi!
Aufgrund eines Verbesserungsvorschlags hab ich meinen Code verändert und zum ersten Mal mit einem Dictionary gearbeitet. Allerdings häng ich jetzt noch an etwas. Hier mal der Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Dictionary<TypeCode, int> countDic = new Dictionary<TypeCode, int>();
TypeCode code = Type.GetTypeCode(werte.GetValue(i, j).GetType()); if (! countDic.ContainsKey(code)) { countDic.Add(code, 0); } ++countDic[code]; |
Von jedem Wert, den ich zurück bekomme, prüfe ich den Typ. Gleiche Typen werden addiert.
Nur jetzt hänge ich gerade. Wie bekomme ich elegant den am häufigsten vorkommenden Typen?
Gruß
Kha - Sa 24.04.10 17:07
Ein Dictionary implementiert IEnumerable<>. Du kannst mit einer foreach-Schleife durchgehen und den jeweils bisher größten Wert in einer Variablen speichern.
Wenn dir LINQ allerdings schon etwas sagt, gibt es keinen Grund, hier das Rad neu zu erfinden. Mit GroupBy und Max solltest du in zwei Zeilen am Ziel sein :) .
Help_Me - Sa 24.04.10 18:19
Ahhh...ich habs noch immer nicht, sorry.
Hab jetzt mir mal paar Beispiele zu LINQ angeschaut und versucht, auf meinen
Code zu übertragen, aber es läuft noch immer nicht...
Kha - Sa 24.04.10 19:58
Hmpf, die naheliegenden Methoden haben die LINQ-Macher natürlich vergessen. Ich dachte an so etwas:
C#-Quelltext
1: 2: 3:
| deineWerteAlsIEnumerable.Select(w => Type.GetTypeCode(w.GetType())) .GroupBy(type => type) .MaxBy(group => group.Count()) |
Ich gehe mal davon aus, dass wir lieber den anderen Weg wählen ;) . Hast du es schon einmal mit
foreach versucht?
Help_Me - So 25.04.10 10:57
Moin!
Habs jetzt mal so gelöst:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| TypeCode theKey = default(TypeCode); int maxVal = int.MinValue; foreach (KeyValuePair<TypeCode, int> cur in countDic) { int curVal = Convert.ToInt32(cur.Value); if (curVal > maxVal) { maxVal = curVal; theKey = cur.Key; } } |
Scheint zu funktionieren. Für Verbesserungsvorschläge bin ich aber offen. :wink:
Christian S. - So 25.04.10 11:04
cur.Value ist schon ein int, das Convert ist also unnötig. Ansonsten erscheint mir das so gut zu sein.
Help_Me - So 25.04.10 11:32
Okay...danke!
Help_Me - So 25.04.10 13:12
Jetzt hab ich doch noch eine Kleinigkeit...
Ich wollte prüfen, ob es sich bei dem Key um einen Key vom Typ DBNull handelt,
diesen würde ich dann nicht mitzählen wollen.
Gedacht hatte ich mir das so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| TypeCode theKey = default(TypeCode); int maxVal = int.MinValue; foreach (KeyValuePair<TypeCode, int> cur in countDic) { int curVal = cur.Value; if (curVal > maxVal) { if (!(cur.Key is DBNull)) { maxVal = curVal; theKey = cur.Key; } } } |
Nur ist cur.Key nie vom Typ DBNull. Warum? :gruebel:
Kha - So 25.04.10 13:56
Help_Me hat folgendes geschrieben : |
Nur ist cur.Key nie vom Typ DBNull. Warum? |
Weil es vom Typ
TypeCode ist ;) .
C#-Quelltext
1:
| if (curVal > maxVal && cur.Key != TypeCode.DBNull) |
Help_Me - So 25.04.10 14:14
Aaahhh...da könnt ich mir in den Hintern beißen.
Ich hatte auch die Prüfung mit TypeCode drin, allerdings immer noch den Operator is.
Danke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!