我刚开始学习 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
不知道如何正确排序。对我做错了什么有什么想法吗?
最佳答案
您缺少的是将 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
对结果进行排序以给出你是你想要的输出:
e1
i1
l2
r2
t1
我还稍微调整了查询结果(只是为了表明它是可能的)以生成一个新的匿名类型,其中包含 Letter 和 Frequency 作为命名属性。这使得 Console.WriteLine
中的代码更清晰一点,因为所使用的属性称为 Letter
和 Frequency
而不是 Key
和 Count()
方法。
使用 C# 7.0 元组将其增加到 11
如果您使用的是 C# 7.0,则可以将匿名类型的使用替换为元组,这意味着代码现在如下所示:
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 ,包括这个询问'Are C# anonymous types redundant in C# 7的Stackoverflow问题',如果您想更深入地了解元组,它们是什么,它们如何工作以及为什么/何时您可能希望优先使用它们而不是匿名类型。
关于C# 按字母顺序排序字符串,后跟出现频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53395709/