Benutzer mit den meisten Antworten
linq abfrage dictionary

Frage
-
Hallo,
ich habe ein sorteddictionary welches wie folgt aufgebaut ist.
internal class dictionary class
{
public double Item1 = 0;
public double Item2 = 0;
}
sorteddictionary<double, dictionaryclass> dictionary = new sorteddictionary <double, dictionaryclass>();
Frage: Wie kann ich z.B. den maximalen Wert der Items1 in dem Dictionary ermitteln, oder wie muss die Syntax aussehen?
Ich suche das Äquivalent zu folgenden Code, wenn das Dictionary nur einen Wert pro Key enthalten würde.
var = Dictionary.Value.Max();
Nochmal zur Verdeutlichung, wie erhalte ich:
var = Dictionary.Item1.Max();
Vielen Dank im Voraus
Antworten
-
Hallo msofths,
Die Methode Max versucht die Werte zu vergleichen, aber wenn sie vom Typ dictionaryclass (benutzerdefiniert) sind, weiß sie nicht, wie sie verglichen werden können. Daher ist mir eingefallen (wenn Du diese Methode aufrufen willst), die Methode CompareTo aus der IComparable-Schnittstelle zu implementieren:
public class dictionaryclass : IComparable { public dictionaryclass(double Item1, double Item2) { this.Item1 = Item1; this.Item2 = Item2; } public double Item1 = 0; public double Item2 = 0; public int CompareTo(object w) { if (this.Item1 < ((dictionaryclass)w).Item1) return -1; if (this.Item1 == ((dictionaryclass)w).Item1) return 0; else return 1; } }
Dann kann das Ergebnis (w) vom Typ double sein und ihm kann das erste Feld des von der Methode Max zurückgegebenen Objekts der dictionaryclass zugewiesen werden:
SortedDictionary<double, dictionaryclass> sd = new SortedDictionary<double, dictionaryclass>();
sd.Add(5.7, new dictionaryclass(4.7, 16.8));
sd.Add(6.9, new dictionaryclass(9.7, 17.9));
sd.Add(9.1, new dictionaryclass(7.2, 17.1));
double w = (sd.Values.Max()).Item1;
//Hier beträgt w 9,7Gruß,
Dimitar
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 17. November 2014 11:23
- Als Antwort vorgeschlagen Aleksander Chalabashiev Dienstag, 18. November 2014 07:18
- Als Antwort markiert Aleksander Chalabashiev Montag, 24. November 2014 07:30
-
Hallo,
wenn ich dich richtig verstehe, willst du aus allen Item1-Werten den höchsten ermitteln. Das geht einfach über die Max-Methode:var max = dic.Max(x => x.Value.Item1);
Der übergebene Lambda-Ausdruck wählt einfach den Wert von Item1 aus und Max ermittelt den größten.Tom Lambert - C# MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Aleksander Chalabashiev Dienstag, 18. November 2014 07:18
- Als Antwort markiert Aleksander Chalabashiev Montag, 24. November 2014 07:30
Alle Antworten
-
Hi,
unter [1] findest du eine ähnliche Problemstellung. Am einfachsten ist es, wenn du in deiner "dictionaryclass" eine Mehtode Max() implementierst, welche einfach aufgerufen wird. Eine andere Option wäre es, die IEnumerable zu implementieren, wie du auch in dem Link sehen kannst.
[1] http://stackoverflow.com/questions/11068580/adding-linq-to-my-classesViele Grüße,
Markus- Bearbeitet Zorro14 Montag, 17. November 2014 10:16
-
Hi,
zuerst musst Du Dich entscheiden, was "Max" bedeuten soll. Du kannst "Max" nach dem Schlüssel, nach Item1 oder nach Item2 ermitteln. Dazu eine kleine Konsolendemo:using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1CS { class Program2 { static void Main(string[] args) { var dic = new SortedDictionary<double, dictionaryclass>(); dic.Add(5, new dictionaryclass() { Item1 = 55, Item2 = 66 }); dic.Add(6, new dictionaryclass() { Item1 = 56, Item2 = 33 }); dic.Add(3, new dictionaryclass() { Item1 = 11, Item2 = 22 }); dic.Add(1, new dictionaryclass() { Item1 = 99, Item2 = 11 }); var res = (from itm in dic orderby itm.Key descending select itm).FirstOrDefault(); Console.WriteLine("nach Key - Key: {0}, Item1: {1}. Item2: {2}",res.Key,res.Value.Item1, res.Value.Item2); res = (from itm in dic orderby itm.Value.Item1 descending select itm).FirstOrDefault(); Console.WriteLine("nach Item1 - Key: {0}, Item1: {1}. Item2: {2}", res.Key, res.Value.Item1, res.Value.Item2); Console.ReadKey(); } internal class dictionaryclass { public double Item1 = 0; public double Item2 = 0; } } }
--
Peter
Meine Homepage mit Tipps und Tricks -
Hallo msofths,
Die Methode Max versucht die Werte zu vergleichen, aber wenn sie vom Typ dictionaryclass (benutzerdefiniert) sind, weiß sie nicht, wie sie verglichen werden können. Daher ist mir eingefallen (wenn Du diese Methode aufrufen willst), die Methode CompareTo aus der IComparable-Schnittstelle zu implementieren:
public class dictionaryclass : IComparable { public dictionaryclass(double Item1, double Item2) { this.Item1 = Item1; this.Item2 = Item2; } public double Item1 = 0; public double Item2 = 0; public int CompareTo(object w) { if (this.Item1 < ((dictionaryclass)w).Item1) return -1; if (this.Item1 == ((dictionaryclass)w).Item1) return 0; else return 1; } }
Dann kann das Ergebnis (w) vom Typ double sein und ihm kann das erste Feld des von der Methode Max zurückgegebenen Objekts der dictionaryclass zugewiesen werden:
SortedDictionary<double, dictionaryclass> sd = new SortedDictionary<double, dictionaryclass>();
sd.Add(5.7, new dictionaryclass(4.7, 16.8));
sd.Add(6.9, new dictionaryclass(9.7, 17.9));
sd.Add(9.1, new dictionaryclass(7.2, 17.1));
double w = (sd.Values.Max()).Item1;
//Hier beträgt w 9,7Gruß,
Dimitar
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 17. November 2014 11:23
- Als Antwort vorgeschlagen Aleksander Chalabashiev Dienstag, 18. November 2014 07:18
- Als Antwort markiert Aleksander Chalabashiev Montag, 24. November 2014 07:30
-
Hallo,
wenn ich dich richtig verstehe, willst du aus allen Item1-Werten den höchsten ermitteln. Das geht einfach über die Max-Methode:var max = dic.Max(x => x.Value.Item1);
Der übergebene Lambda-Ausdruck wählt einfach den Wert von Item1 aus und Max ermittelt den größten.Tom Lambert - C# MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Aleksander Chalabashiev Dienstag, 18. November 2014 07:18
- Als Antwort markiert Aleksander Chalabashiev Montag, 24. November 2014 07:30
-