C#按字母顺序对字符串进行排序,后跟出现频率

时间:2018-11-20 14:56:09

标签: c# linq

我刚刚开始学习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

无法弄清楚如何正确排序。对我在做什么错有任何想法吗?

3 个答案:

答案 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中的代码更加清晰,因为所使用的属性称为LetterFrequency而不是KeyCount()方法。

使用C#7.0元组将其设置为11

如果您使用的是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 thisother 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}");
}