Частота появления элементов в массиве. Код работает, но ищет лучший ответ - PullRequest
0 голосов
/ 09 января 2019

Я ищу более эффективный и простой способ подсчета количества элементов в массиве и частоты их появления. GroupBy - очевидный ответ, но тогда я бы хотел получить результат, который будет иметь те же размеры, что и исходный массив.

Я пишу это на C # и хочу использовать лямбда-выражения. Мой код работает, но должен быть лучший способ сделать что-то такое простое.

        var testarray = new int[10]
        { 3, 3, 4, 1, 2, 5, 3, 1, 2, 5 };


        var groups = testarray.GroupBy(p => p)
            .Select(group => new
            {
                TestKey = group.Key,
                Count = group.Count()
            });

        var final = testarray.Join(groups,
            src => src,
            dest => dest.TestKey,
            (src, dest) => dest.Count
            ).ToArray();

Входной сигнал: { 3, 3, 4, 1, 2, 5, 3, 1, 2, 5 }

Ожидаемые и фактические результаты: {3, 3, 1, 2, 2, 2, 3, 2, 2, 2}

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Выполнение GroupBy эффективно создает внутренний Dictionary (фактически Lookup), а затем вы разбиваете его обратно, чтобы создать окончательный Dictionary.

Это мне кажется расточительным. Может быть более эффективно использовать ToLookup, который возвращает Lookup, а затем получить значения:

var counts = testarray.ToLookup(n => n);
var final = testarray.Select(t => ((ICollection<int>)counts[t]).Count).ToArray();
0 голосов
/ 09 января 2019

Я бы использовал GroupBy, чтобы сгруппировать элементы, хранящие счетчики в Dictionary, а затем создать окончательный массив, просматривая каждый элемент в словаре, чтобы получить его счет.

var testarray = new int[10] { 3, 3, 4, 1, 2, 5, 3, 1, 2, 5 };
var dict = testarray.GroupBy(item => item).ToDictionary(item => item.Key, item => item.Count());
var final = testarray.Select(item => dict[item]).ToArray();

testarray
3, 3, 4, 1, 2, 5, 3, 1, 2, 5

финал
3, 3, 1, 2, 2, 2, 3, 2, 2, 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...