Получить топ-3 самых встречающихся номеров в списке - PullRequest
2 голосов
/ 12 января 2020

Допустим, у меня есть список целых. Я добавляю несколько значений:

list.Add(5);

list.Add(5);

list.Add(27);

list.Add(3);

list.Add(4);

list.Add(4);

list.Add(29);

list.Add(3);

Как получить 3 большинство встречающихся чисел ? Вот так: 5, 3 и 4.

Я пробовал:

public static IEnumerable<T> Mode<T>(this IEnumerable<T> input)
{
    var dict = input.ToLookup(x => x);
    if (dict.Count == 0)
        return Enumerable.Empty<T>();
    var maxCount = dict.Max(x => x.Count());
    return dict.Where(x => x.Count() == maxCount).Select(x => x.Key);
}

Но мне возвращается только один номер.

Ответы [ 3 ]

1 голос
/ 12 января 2020

Это должно работать нормально

var topThreeMostOccuring = arr.GroupBy(x => x)
.OrderByDescending(g => g.Count())
.SelectMany(x => x.Take(1)).Take(3);
1 голос
/ 12 января 2020

Вы можете использовать Linq:

var top3 = list.GroupBy(x => x)
               .OrderByDescending(x => x.Count())
               .Take(3)
               .Select(x => x.Key);

Console.WriteLine(string.Join(" ", top3)); // output 5 3 4
0 голосов
/ 12 января 2020

Надеюсь, это поможет вам

 var list = new List<int>();

        list.Add(5);
        list.Add(5);
        list.Add(27);
        list.Add(4);
        list.Add(3);
        list.Add(4);
        list.Add(4);
        list.Add(29);
        list.Add(3);
        list.Add(5);
        list.Add(4);



       var TheMostoccurring =  list.GroupBy(n => n).OrderByDescending(m => m.Count()).Select(m => m.Key).ToList().Take(3);



        foreach (var item in TheMostoccurring)
        {
            Console.WriteLine(item);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...