Benutzer mit den meisten Antworten
Newbie Frage zu 'Sum(Func<>)'

Frage
-
Hi,
ich bin noch relativ neu in C# (sprich in der Lernphase) und versuche folgendes zu verstehen. Dazu erst einmal etwas Code:class Program { static void Main(string[] args) { List<MyClass> MeineListe = new List<MyClass> {
new MyClass(10, "Erste"), new MyClass(20, "Zweite"),
new MyClass(30, "Dritte") }; Func<MyClass, Int64> MyDel; MyDel = Selection; long sum = MeineListe.Sum(MyDel); } public class MyClass { public Int64 zahl; public string name; // Konstruktor public MyClass(Int64 Zahl, string Name) { zahl = Zahl; name = Name; } } public static Int64 Selection(MyClass m) { return m.zahl; } }..mir geht es hier nun um die Methode 'Sum', welche ich über 'MeineListe' aufrufe. Das Beispiel funktioniert so einwandfrei (weil ich ja wie gefordert ein Delegate übergebe, welches 'Func<in, out>' entspricht. Die Frage, woran ich mir bisher die Zähne ausgebissen habe, ist nun, warum ich im Beispiel 'Selection' nicht direkt als Parameter an 'Sum' übergeben kann (das ist doch quasi das gleiche, wie die Zuweisung über 'MyDel', nur eben direkt in 'Sum'). Bei mir zumindest geht das nicht, ich kriege hier immer die Fehlermeldung, dass sich 'Func<MyClass, decimal>' und 'Func<MyClass, decimal?>' nicht genügend unterscheiden. Für eine Erklärung wäre ich sehr dankbar.
Grüße, Rainer
- Bearbeitet [DE]Rainer Mittwoch, 16. April 2014 17:12
Antworten
-
Hallo,
grundsätzlich erfordern viele der LINQ-Methode einen Delegaten, so auch Sum. Das einfachste ist wohl ein Lambdaausdruck:long sum = MeineListe.Sum(x => x.zahl);
Es wird x als Parameter übergeben (Ist je ein Element deiner Klasse) und eine Zahl zurück gegeben.
Du kannst aber auch richtige Methoden dafür einsetzen:
long sum = MeineListe.Sum(Selection);
Das Problem an diesem Aufruf ist nun, das der Compiler nicht erkennt ob die Methode ein int oder ein int? zurück gibt. Denn für beide Fälle gibt es verschiedene Methoden. Somit ist ein Cast erforderlich:long sum = MeineListe.Sum((Func<MyClass, Int64>)Selection);
Der Delegat, wie in deinem Code, zeigt den angegebenen Rückgabetyp direkt an, weswegen das kein Problem ist.
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert [DE]Rainer Mittwoch, 16. April 2014 17:51
-
Hi Rainer,
MyDel hat ja die Form <MyClass,Int64> (Verenfacht wird da intern die Verknüpfung gemacht), Selectin nur <MyClass> gibt aber einen Integer Wert zurück.
Wenn du direkt in der Sum Funktion rechnen willst sollte es mit solte es so Funktionieren.
MyList.Sum( s => s.zahl);
Zur Erklärung schau dir mal den Artikel an.
MFG
Björn
- Als Antwort markiert [DE]Rainer Mittwoch, 16. April 2014 18:29
Alle Antworten
-
Hallo,
grundsätzlich erfordern viele der LINQ-Methode einen Delegaten, so auch Sum. Das einfachste ist wohl ein Lambdaausdruck:long sum = MeineListe.Sum(x => x.zahl);
Es wird x als Parameter übergeben (Ist je ein Element deiner Klasse) und eine Zahl zurück gegeben.
Du kannst aber auch richtige Methoden dafür einsetzen:
long sum = MeineListe.Sum(Selection);
Das Problem an diesem Aufruf ist nun, das der Compiler nicht erkennt ob die Methode ein int oder ein int? zurück gibt. Denn für beide Fälle gibt es verschiedene Methoden. Somit ist ein Cast erforderlich:long sum = MeineListe.Sum((Func<MyClass, Int64>)Selection);
Der Delegat, wie in deinem Code, zeigt den angegebenen Rückgabetyp direkt an, weswegen das kein Problem ist.
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert [DE]Rainer Mittwoch, 16. April 2014 17:51
-
Hi Rainer,
MyDel hat ja die Form <MyClass,Int64> (Verenfacht wird da intern die Verknüpfung gemacht), Selectin nur <MyClass> gibt aber einen Integer Wert zurück.
Wenn du direkt in der Sum Funktion rechnen willst sollte es mit solte es so Funktionieren.
MyList.Sum( s => s.zahl);
Zur Erklärung schau dir mal den Artikel an.
MFG
Björn
- Als Antwort markiert [DE]Rainer Mittwoch, 16. April 2014 18:29