Benutzer mit den meisten Antworten
Suche LINQ-Ausdruck für zwei Schleifen

Frage
-
Hallo,
der Code funktioniert mit den zwei foreach-Schleifen.decimal p = 0; foreach (var c in Coils) { if (c.ParentLineId == null) { p = p + c.Price; foreach (var a in Coils) { if (a.ParentLineId == c.LineId) { p = p + a.Price; } } } } Price = p;
Jetzt will ich beide Schleifen durch einen LINQ-Ausdruck ersetzen.
Ich komme aber nicht weiter als:
Price = Coils.Where(c => c.ParentLineId == null).Sum(c => c.Price);
Wie lautet der vollständige LINQ-Ausruck?
Danke.
Antworten
-
Hi Alexander,
die Lösung ist ganz einfach:Price = Coils.Sum((d) => d.Price);
Testen kannst du das mit folgender Demo:
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp1 { class Program1 { static void Main(string[] args) { try { (new Demo()).Execute(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("Continue enter key"); Console.ReadKey(); } internal class Demo { private decimal Price=0; private List<Data> Coils = new List<Data>(); private Random rnd = new Random(); internal void Execute() { // for (int i = 1; i < 1000; i++) { Data d = new Data() { LineId = i }; if (i > 100) d.ParentLineId = rnd.Next(1, 101); d.Price = rnd.Next(10, 100) / 10; Coils.Add(d); } // decimal p = 0; foreach (var c in Coils) { if (c.ParentLineId == null) { p = p + c.Price; foreach (var a in Coils) { if (a.ParentLineId == c.LineId) { p = p + a.Price; } } } } Price = p; Console.WriteLine(Price); Price = Coils.Sum((d) => d.Price); Console.WriteLine(Price); } } internal class Data { internal int? ParentLineId { get; set; } internal int LineId { get; set; } internal decimal Price { get; set; } } } }
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks
- Bearbeitet Peter Fleischer Freitag, 22. Januar 2021 09:45
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Dienstag, 26. Januar 2021 09:42
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 4. Februar 2021 06:40
-
Hi Alexander,
in deinem Beispiel benötigst du keine If-Bedingungen, da du folgendes machst:äußere Schleife: addiere Price von allen Objekten mit ParentLineId == null
innere Schleife: addiere Price von allen Objekten, die eine ParentLineId haben, d.h. von allen restlichen Objekten.
Das ergibt eine Summe über alle Objekte.
Wenn du andere Bedingungen hast, dann zeig sie mal.
Alternativ kannst du natürlich das auch so machen:
Price = Coils.Where((c) => c.ParentLineId == null).Select((a) => new { S1 = a.Price, Ds = Coils.Where((b) => b.ParentLineId == a.LineId).Sum((d) => d.Price) }).Sum((e) => e.S1 + e.Ds);
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks- Bearbeitet Peter Fleischer Samstag, 23. Januar 2021 20:19
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Dienstag, 26. Januar 2021 09:42
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 4. Februar 2021 06:39
Alle Antworten
-
Hi Alexander,
die Lösung ist ganz einfach:Price = Coils.Sum((d) => d.Price);
Testen kannst du das mit folgender Demo:
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp1 { class Program1 { static void Main(string[] args) { try { (new Demo()).Execute(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("Continue enter key"); Console.ReadKey(); } internal class Demo { private decimal Price=0; private List<Data> Coils = new List<Data>(); private Random rnd = new Random(); internal void Execute() { // for (int i = 1; i < 1000; i++) { Data d = new Data() { LineId = i }; if (i > 100) d.ParentLineId = rnd.Next(1, 101); d.Price = rnd.Next(10, 100) / 10; Coils.Add(d); } // decimal p = 0; foreach (var c in Coils) { if (c.ParentLineId == null) { p = p + c.Price; foreach (var a in Coils) { if (a.ParentLineId == c.LineId) { p = p + a.Price; } } } } Price = p; Console.WriteLine(Price); Price = Coils.Sum((d) => d.Price); Console.WriteLine(Price); } } internal class Data { internal int? ParentLineId { get; set; } internal int LineId { get; set; } internal decimal Price { get; set; } } } }
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks
- Bearbeitet Peter Fleischer Freitag, 22. Januar 2021 09:45
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Dienstag, 26. Januar 2021 09:42
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 4. Februar 2021 06:40
-
Hi Alexander,
in deinem Beispiel benötigst du keine If-Bedingungen, da du folgendes machst:äußere Schleife: addiere Price von allen Objekten mit ParentLineId == null
innere Schleife: addiere Price von allen Objekten, die eine ParentLineId haben, d.h. von allen restlichen Objekten.
Das ergibt eine Summe über alle Objekte.
Wenn du andere Bedingungen hast, dann zeig sie mal.
Alternativ kannst du natürlich das auch so machen:
Price = Coils.Where((c) => c.ParentLineId == null).Select((a) => new { S1 = a.Price, Ds = Coils.Where((b) => b.ParentLineId == a.LineId).Sum((d) => d.Price) }).Sum((e) => e.S1 + e.Ds);
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks- Bearbeitet Peter Fleischer Samstag, 23. Januar 2021 20:19
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Dienstag, 26. Januar 2021 09:42
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 4. Februar 2021 06:39
-
Hallo AlexanderRi,
Ich nehme an, dass Peters Antworten Dir weitergeholfen haben. Bitte lass uns wissen, wenn Du zusätzliche Fragen hast.
Gruß,
Ivan DragovBitte 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.