我刚刚开始学习lambda / linq。到目前为止,这就是我所拥有的。
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
无法弄清楚如何正确排序。对我在做什么错有任何想法吗?
答案 0 :(得分:6)
您缺少的是在LINQ语句中添加orderby
:
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
会对结果进行排序,从而为您提供所需的输出:
e1
i1
l2
r2
t1
我还略微调整了查询的结果(只是为了表明这是可能的),以生成一个新的匿名类型,该类型包含Letter和Frequency作为命名属性。这使Console.WriteLine
中的代码更加清晰,因为所使用的属性称为Letter
和Frequency
而不是Key
和Count()
方法。>
如果您使用的是C#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}");
}
我有blogged about this,other resources中有很多describe them,包括这个Stackoverflow问题,如果您想更深入地了解,请问'Are C# anonymous types redundant in C# 7'元组,它们是什么,它们如何工作以及为什么/何时/您可能想要优先于匿名类型使用它们。
答案 1 :(得分:2)
只需对您的列表进行如下排序:
foreach (var f in frequency.OrderBy(item=>item.Key))
{
Console.WriteLine($"{f.Key}{f.Count()}");
}
答案 2 :(得分: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}");
}