Laden...

Aus Array an Integers alle vorkommenden Zahlen zu gruppieren und ihre Anzahl ausgeben

Erstellt von CoderboyPB vor 4 Jahren Letzter Beitrag vor 4 Jahren 913 Views
C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 4 Jahren
Aus Array an Integers alle vorkommenden Zahlen zu gruppieren und ihre Anzahl ausgeben

Die Aufgabe ist es aus einem Array an Integers alle vorkommenden Zahlen zu gruppieren und ihre Anzahl anzugeben.
Bsp: Wie viele Einsen, wie viele Dreien, etc ...

ich habe jetzt nach ewigen ausprobieren folgende Lösung gefunden:


var diceGroups = dice.Distinct().GroupBy(d => d, d=>Array.FindAll(dice,a=>a==d).Count(), (key, result) => new
            {
                Number = key,
                Count = result}
            );

Wenn ich das jetzt wie folgt abfrage funktioniert das auch:


foreach(var result in diceGroups)
            {

                Console.WriteLine($"Number: {result.Number} - Count: {result.Count.First()}");
            }

Aber warum ist Count in dem Ergebnis Object ein IEnumerable<int> anstatt eines einfachen int ???
Das ist ne Spur zu hoch für mich. Das muss doch auch irgendwie noch anders gehen, oder nicht?

Hab ja versucht die .NET Dokumentation zu bemühen, aber diesen Funktionssignaturen mit etlichen Generics, ja, verstehen tue ich es, aber ich ÜBERBLICKE es nicht. Bevor ich das Überblicke lerne ich lieber noch Barcode lesen ... 😁

16.806 Beiträge seit 2008
vor 4 Jahren

Kurz: (key, result) Keyist Dein key und Result alle Treffer des Keys.
Mittel: Da die Treffer potentiell immer eine Liste sind (indexierter Zugriff alá Dictionary) muss Count zwangsläufig eben eine Liste sein.

Womöglich willst Du:

{
   Number = key,
   Count = result.Count() 
}

PS: in der Linq Schreibweise ist meiner Meinung nach GroupBy einfacher zu verstehen als in der Lambda-Schreibweise.

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 4 Jahren

Ich danke dir.
Aber statt Count() muss da First() in das Select Object, sonst ist jeder Wert immer 1.

Die Aufgabenstellung ist übrigens Teil einer Kata aus Codewars.com:

Es wird ein Array mit 5 Würfelergebnissen übergeben, und für jeden Dreierpasch, gibt es den Würfelwert mal 100 als Punkte, also drei Zweier 200 Punkte, drei Dreier 300, usw ...

Ausnahme sind die Einer und 5er:

Drei Einer sind 1000 Punkte, und jeder einzelne Einer 100 Punkte.
Einzelne 5er, also unterhalb von dreien geben 50 Punkte.

Die Funktion soll die Punkte ausgeben.

Hatte erst ne 'Fußgängermethode' für die Häufigkeiten, aber ich will ja auch was dabei lernen, und so versuche ich halt auch solche Sachen wie Linq und co mit zuverwenden.

16.806 Beiträge seit 2008
vor 4 Jahren

Nicht alles mit Linq/Lambda ist besser, schneller oder übersichtlicher.
Lambda kann auch deutlich schlechter in Sachen Code Wartung oder Geschwindigkeit sein; "normale Schleifen" haben weiterhin ihre Daseinsberechtigung.