Average eines Array

  • C#
  • .NET 5–6

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von MrLaTuNiX.

    Average eines Array

    Moin leute ,

    kurze frage an euch ich habe das hier

    C#-Quellcode

    1. double d_1 = 0.0;
    2. double d_2 = 0.5;
    3. double d_3 = 0.2;
    4. double d_4 = 0.6;
    5. double[] test = new double[] { d_1, d_2, d_3, d_4 };
    6. double averagetest = test.Average();


    Er berechnet mir jetzt den Durchschnittswert , ich will aber das er mir den Durschnittswert berechnet ohne das er die 0.0 stellen mit berechnet , wie geht das ?
    das heißt d_1 sollte jetzt indem fall nicht mit berechnet werden
    Na klar.
    Where ist eine Linq-Methode, welche dir eine IEnumerable<T> zurückgibt (in deinem Fall eine IEnumerable<double>, also eine Auflistung von double Werten). Von dieser zurückgegebenen Auflistung bildest du jetzt wie gehabt den Durchschnitt mit .Average()
    Where erwartet ein predicate, sprich eine Funktion, mit der jedes Element auf eine Bedingung überprüft wird. In meinem Beispiel überprüfe ich alle Elemente einzeln, ob diese größer als 0 sind. Alle Elemente in test, die diese Bedingung erfüllen, werden in einer IEnumerable<double> von Where zurückgegeben und danach wird der Durchschnitt gebildet.

    Wenn der Code beispielsweise so aussehen würde:

    C#-Quellcode

    1. double averagetest = test.Where(x => x >= 0).Average();
    Würdest du den selben Wert erhalten wie mit test.Average(); , da das predicate für Where jetzt auf die Bedingung >= 0 prüft, und somit d_1 auch in der zurückgegebenen IEnumerable<double> enthalten ist.
    Ich hoffe das war halbwegs verständlich.
    Dumm ist der, der dumm ist. Nicht andersrum!
    Wenn du

    C#-Quellcode

    1. double averagetest = test.Where(x => x > 0).Average();

    verwendest, test aber nur Elemente enthält, die kleiner oder gleich 0 sind, sollte eine Exception geworfen werden (System.InvalidOperationException: "Die Sequenz enthält keine Elemente."). Where findet dann natürlich kein Element, auf das die Bedingung > 0 zutrifft und gibt dir quasi eine leere Liste. Ein Durchschnitt von einer leeren Auflistung kann natürlich nicht gebildet werden und folglich knallt es da.
    Um das zu verhindern kannst du vorher abfragen, ob test überhaupt entsprechende Elemente besitzt. Dazu bietet sich die nächste Linq-Methode Any an.

    C#-Quellcode

    1. bool sindWerteEnthalten = test.Any(x => x > 0);

    Wenn sindWerteEnthalten true ist, kannst du wie bisher den Durchschnitt von Where(x => x > 0) bilden, ist der Wert false machst du was anderes oder gar nichts, je nach deinem Anwendungsfall. Wenn du zu einem späteren Zeitpunkt nicht mehr wissen musst, ob entsprechende Elemente enthalten sind, kannst du dir die lokale Variable sindWerteEnthalten natürlich sparen und den return-Wert von Any direkt abfragen.

    C#-Quellcode

    1. double averagetest;
    2. if (test.Any(x => x > 0))
    3. {
    4. averagetest = test.Where(x => x > 0).Average();
    5. }
    6. else
    7. {
    8. //was anderes oder den else-Pfad ganz weglassen
    9. }

    Dumm ist der, der dumm ist. Nicht andersrum!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Schmittmuthelm“ ()