C # строка сортировки в алфавитном порядке с частотой встречаемости

2

Я только начал изучать лямбда/линк. Вот что у меня так далеко.

var frequency = from f in "trreill".ToList()
                group f by f into letterfrequency
                select letterfrequency;

foreach (var f in frequency)
{
    Console.WriteLine($"{f.Key}{f.Count()}");
}

Вот вывод:

t1 r2 e1 i1 l2

Требуется вывод:

e1i1l2r2t1

Не могу понять, как правильно сортировать. Есть мысли, что я делаю не так?

  • 1
    frequency = frequency.OrderBy(x => x.Count);
  • 0
    Вы просто хотите заказать по letterfrequency.Key , а затем по letterfrequency.Count() ? Учитывая вашу группировку, последнее не будет иметь значения.
Показать ещё 4 комментария
Теги:
linq

3 ответа

6
Лучший ответ

То, что вам не хватает, это добавление orderby к вашему выражению LINQ:

var frequency = from f in "trreill"
                group f by f into letterfrequency
                orderby letterfrequency.Key
                select new
                {
                    Letter = letterfrequency.Key,
                    Frequency = letterfrequency.Count()
                };

foreach (var f in frequency)
{
    Console.WriteLine($"{f.Letter}{f.Frequency}");
}

letterfrequency имеет свойство Key которое содержит букву для каждой группы, поэтому добавление orderby letterfrequency.Key сортирует результаты, чтобы получить результат, который вам orderby letterfrequency.Key:

e1

i1

l2

r2

t1

Я также слегка подправил результат запроса (просто для того, чтобы показать, что это возможно), чтобы сгенерировать новый анонимный тип, который содержит свойства Letter и Frequency в качестве именованных свойств. Это делает код в Console.WriteLine несколько понятнее, поскольку используемые свойства называются Letter и Frequency а не Key и методом Count().

Поворот до 11 с использованием кортежей С# 7.0

Если вы используете С# 7.0, вы можете заменить использование анонимного типа на Tuples, это означает, что код теперь будет выглядеть так:

var frequency = from f in "trreill"
                group f by f into letterfrequency
                orderby letterfrequency.Key
                select
                (
                    Letter: letterfrequency.Key,
                    Frequency: letterfrequency.Count()
                );


foreach (var (Letter, Frequency) in frequency)
{
    Console.WriteLine($"{Letter}{Frequency}");
}

Я писал об этом в блоге, и есть множество других ресурсов, которые описывают их, в том числе вопрос Stackoverflow, который спрашивает " Являются ли анонимные типы С# избыточными в С# 7 ", если вы хотите глубже погрузиться в кортежи, что они такое, как они работать и почему/когда вы можете использовать их в предпочтении анонимных типов.

  • 0
    .ToList() является избыточным
  • 2
    Хотя это хорошо, его можно улучшить двумя небольшими способами. (1) удалите ненужный ToList и (2) в C # 7 выберите в кортеж, а не в анонимный тип.
2

Просто отсортируйте ваш список следующим образом:

        foreach (var f in frequency.OrderBy(item=>item.Key))
        {
            Console.WriteLine($"{f.Key}{f.Count()}");
        }
1

Я бы выбрал в анонимный объект:

var frequency = from f in "trreill"
                     group f by f into letterfrequency
                     select new { Key = letterfrequency.Key, Count = letterfrequency.Count() };

Тогда я бы заказал это так:

foreach (var f in frequency.OrderBy(x => x.Key))
{
    Console.WriteLine($"{f.Key}{f.Count}");
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню