none
Suche LINQ-Ausdruck für zwei Schleifen RRS feed

  • 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.


    Freitag, 22. Januar 2021 08:35

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


    Freitag, 22. Januar 2021 09:44
  • 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


    Freitag, 22. Januar 2021 12:38

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


    Freitag, 22. Januar 2021 09:44
  • Hallo Peter,

    es fehlen aber die if-Bedingungen. Gerade das macht es für mich schwierig.

    Alexander

    Freitag, 22. Januar 2021 09:51
  • 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


    Freitag, 22. Januar 2021 12:38
  • Hallo AlexanderRi,

    Ich nehme an, dass Peters Antworten Dir weitergeholfen haben. Bitte lass uns wissen, wenn Du zusätzliche Fragen hast.

    Gruß,

    Ivan Dragov

    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.

    Donnerstag, 4. Februar 2021 06:42
    Administrator