Wyszukanie mody z użyciem LINQ oraz konwersja VB na C#

0

Witam. Program jako zadanie ma wypisać modę. Problem jest w tym, że może pojawić się więcej niż jedna moda:
Przykładowe elementy tablicy: {1, 1, 2, 2, 3,}
Program wypisuje tylko "2".
screenshot-20200110153359.png

            int mode = a.GroupBy(v => v).OrderByDescending(d => d.Count()).First().Key;
            Console.Write("\nModa: " + mode);

Chciałbym to przekształcić w taki sposób, żeby wypisywało więcej niż jedną modę. Prawdopodobnie problem tkwi w First(). Poszukałem troszkę i gdzieś zalecają użycie SelectMany. Jednak po wielu nieudanych próbach nie udało mi się. Dodatkowo jak wklepać tam jakiś warunek, który by sprawdził, czy jakieś liczby się powtarzają? Bo jeśli żadna się nie powtarza (np. 1, 2, 3 ,4, 5) to wypisze "5".


Druga sprawa to konwersja z VB na C#. Konwertery, które są dostępne online nie wspierają LINQ, dlatego jeśli ktoś zna się na VB i C# to ucieszę się chociażby z przekształcenia poniższego kodu VB na C#.

Dim modes = From a In _
(From n In numbers _
Group n By n Into g = Count() _
Select g, n) _
Where a.g = _
(From n In numbers _
Group n By n Into g = Count() Select g).Max _
Select a.n
1

Problem polega na tym, że Ty próbujesz przypisać wiele liczb do zmiennej przechowującej tylko jedną liczbę typu int mode.

Rozwiązanie (tego przypisania) jest trywialne:

var modes = a.GroupBy(v => v).OrderByDescending(d => d.Count()).Select(g => g.Key);
foreach (var mode in modes)
    Console.Write("\nModa: " + mode);

(Tylko to oczywiście nie znajduje żadnej mody, a jedynie grupuje i sortuje.)

1 użytkowników online, w tym zalogowanych: 0, gości: 1