Jump to content
Unity Insider Forum
Sign in to follow this  
peachplayer

dynamische Summen bilden mit Linq

Recommended Posts

Hallo Leute

Weiss jemand wie man mit Linq dynamische Summen bilden kann? D.h. ich möchte von einer vorher definierten Liste die Datensätze

nach "Parzellenname" aufsummieren. Das  Resultat sollte dann die Kostensumme pro Parzellenname sein! Leider klappt das bisher nicht optimal, da nur Teilsummen gebildet werden.

Kann mir jemand helfen?

Ich verwende folgenden Code:

        
	    liste1 = new List<KostenEintrag>();

		var parzellen1 = liste1.GroupBy(item => item.GetParzellenname());
        foreach (var parzelle in parzellen1)
        {
            // Code der pro Parzellenname ausgeführt wird
            // parzelle enthält alle Einträge der jeweiligen Parzelle

            string parzellenName = parzelle.Key;
            float parzellenSumme = parzelle.Sum(item => item.Summebilden());
            KostenAusgabe += parzellenSumme + "\n";
            Kostentotal += parzellenSumme;
         

        }

public class KostenEintrag : IComparable<KostenEintrag>
{
    int Nummer;
    string Parzellenname;
    float Kosten_d;
    float Kosten_pf;
    float Kosten_f;
    float totaleKosten;
    float KostenSumme;
    float Erlös;
    public KostenEintrag(int nr, string v, float kd, float kpf, float kf, float e)
    {
        Nummer = nr;
        Parzellenname = v;
        Kosten_d = kd;
        Kosten_pf = kpf;
        Kosten_f = kf;
        Erlös = e;


    }
    public int GetNummer()
    {
        return Nummer;
    }
    public string GetParzellenname()
    {
        return Parzellenname;
    }

    public float GetKosten_d()
    {

        return Kosten_d;
    }
    public float GetKosten_pf()
    {

        return Kosten_pf;
    }
    public float GetKosten_f()
    {

        return Kosten_f;
    }
    public float GetErlös()
    {
        return Erlös;
    }
    public bool GroesserAls(float neu)
    {
        if (Nummer > neu)
            return true;
        else
            return false;
    }
    public float Summebilden()
    {
        totaleKosten = Kosten_d + Kosten_pf + Kosten_f;
        return totaleKosten;
    }
    public int CompareTo(KostenEintrag b)
    {
        // Alphabetic sort name[A to Z]
        return this.Parzellenname.CompareTo(b.Parzellenname);
    }
   
}

 

Share this post


Link to post
Share on other sites

Wenn du schon mit deiner Schleife durch alle Parzellen gehst, dann brauchst du da ja keinen extra-Linq-Ausdruck mehr dafür, die Teilsummen zusammenzurechnen.

float gesamtsumme = 0f;

foreach (var parzelle in parzellen1)
{
  float parzellenSumme = parzelle.Sum(item => item.Summebilden());
  gesamtsumme += parzellenSumme;
}

Debug.Log(gesamtsumme);

 

Share this post


Link to post
Share on other sites

Oder man fasst es noch kürzer zusammen... Gib mir die Summe aller Parzellen gebildeten Summen. :D

float gesamtsumme = parzellen1.Sum(parzelle => parzelle.Summebilden());
Debug.Log(gesamtsumme);

 

Share this post


Link to post
Share on other sites

Ja aber ist doch bescheuert da ein zweites Mal drüberzuitereieren wenn es die Schleife bereits einmal tut.

Share this post


Link to post
Share on other sites
  float parzellenSumme = parzelle.Sum(item => item.Summebilden());
  gesamtsumme += parzellenSumme;

Hallo Sascha
Mit diesen 2 Zeilen wird doch nur die Summe ALLER Kosten gebildet, aber nicht die Summe der Kosten pro Parzelle!

Muss man ev. eine zweite Schleife machen?

Kann mir jemand weiterhelfen?

Share this post


Link to post
Share on other sites
vor einer Stunde schrieb peachplayer:

  float parzellenSumme = parzelle.Sum(item => item.Summebilden());
  gesamtsumme += parzellenSumme;

Hallo Sascha
Mit diesen 2 Zeilen wird doch nur die Summe ALLER Kosten gebildet, aber nicht die Summe der Kosten pro Parzelle!

Muss man ev. eine zweite Schleife machen?

Kann mir jemand weiterhelfen?

Du iterierst durch alle Parzellen.

In jedem Loop nimmst Du dir die aktuelle Parzelle und bildest die Summe aller in der Parzelle befindlichen Elemente.

Danach addierst Du zur Gesamtsumme die jeweilige Summe der Parzelle.

Du hast dann also "gesamtsumme", wo die... Gesamtsumme aller Parzellen enthalten ist und die parzellenSumme pro Loop, die die Summe deiner Parzelle abbildet.

Sollte also so passen. :)

Share this post


Link to post
Share on other sites

Vielleicht haben wir ja dein Problem nicht richtig verstanden.

Am 12.2.2019 um 13:37 schrieb peachplayer:

Das  Resultat sollte dann die Kostensumme pro Parzellenname sein!

Heißt das, dein gewünschtes Ergebnis sind mehrere Zahlen? Also so viele Zahlen, wie du Parzellen hast?

Share this post


Link to post
Share on other sites

Ja dann... ich hinterfrage mal nicht den Sinn dahinter.

var summen = new float[parzellen1.Length];

for (var i = 0; i < parzellen1.Length; i++)
{
  float parzellenSumme = parzellen1[i].Sum(item => item.Summebilden());
  summen[i] = parzellenSumme;
}

 

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×