为每个字母c#创建字典出现次数

时间:2017-06-28 08:07:22

标签: c# dictionary

我们有一个程序可以显示一个字母在文本中重复的次数

string txt = input.text.ToLower();
        txt = Regex.Replace(txt, @"\s+", "").Replace(")","").Replace("(","").Replace(".","").Replace(",","").Replace("!","").Replace("?","") ;
        var letterCount = txt.Where(char.IsLetter).GroupBy(c => c).Select(v => new { Letter = v.Key, count = v.Count() });

        foreach (var c in letterCount)
        {
            Debug.Log(string.Format("Caracterul:{0} apare {1} ori", c.Letter.ToString(), c.count));
        }

我如何为最重复的字母赋予26的值,然后对于重复的字母为25,以及只有一次按字母顺序排列的值? 例如,文字“我们都很开心” 字母A重复三次,值为26 对于字母L 25 对于P 24和其他按字母顺序

最后,得到他们的总和? 抱歉我的英文!!!

2 个答案:

答案 0 :(得分:2)

您可以使用此LINQ方法:

string input = "we are all happy";
var allCharValues = input.ToLookup(c => c)
    .Where(g => g.Key != ' ') // or you want spaces?
    .OrderByDescending(g => g.Count())
    .ThenBy(g => g.Key)  // you mentioned alphabetical ordering if two have same count
    .Select((x, index) => new { Char = x.Key, Value = 26 - index, Count = x.Count() });
foreach (var x in allCharValues)
    Console.WriteLine($"Char:{x.Char} Value:{x.Value} Count:{x.Count}");

int sum = allCharValues.Select(x => x.Value).Sum();

答案 1 :(得分:0)

关于删除不需要的字符的问题:

我认为你最好只保留az之间的所有字符。您可以编写一个扩展方法来执行此操作,并同时转换为小写:

public static class StringExt
{
    public static string AlphabeticChars(this string self)
    {
        var alphabeticChars = self.Select(char.ToLower).Where(c => 'a' <= c && c <= 'z');
        return new string(alphabeticChars.ToArray());
    }
}

然后您可以使用如下方法。这类似于Tim的方法,但它使用GroupBy()来计算事件的数量;它还使用C#7中的新Tuple语法来简化操作。请注意,此ALSO命名元组属性,因此它们不使用默认的Item1Item2

string txt = "we, (are?) all! happy.";

var r = txt
    .AlphabeticChars()
    .GroupBy(c => c)
    .Select(g => (Count: g.Count(), Char: g.Key))
    .OrderByDescending(x => x.Count)
    .ThenBy(x => x.Char)
    .Select((v, i) => (Occurance: v, Index: 26-i));

int sum = r.Sum(c => c.Occurance.Count * c.Index);

Console.WriteLine(sum);