Я только начал изучать лямбда/линк. Вот что у меня так далеко.
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
Не могу понять, как правильно сортировать. Есть мысли, что я делаю не так?
То, что вам не хватает, это добавление 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()
.
Если вы используете С# 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 ", если вы хотите глубже погрузиться в кортежи, что они такое, как они работать и почему/когда вы можете использовать их в предпочтении анонимных типов.
.ToList()
является избыточным
Просто отсортируйте ваш список следующим образом:
foreach (var f in frequency.OrderBy(item=>item.Key))
{
Console.WriteLine($"{f.Key}{f.Count()}");
}
Я бы выбрал в анонимный объект:
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}");
}
frequency = frequency.OrderBy(x => x.Count);
letterfrequency.Key
, а затем поletterfrequency.Count()
? Учитывая вашу группировку, последнее не будет иметь значения.