2017-06-28 51 views
-1

创建字典出现我们有一个程序,它显示了一个字母有多少次在文本每个字母C#

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

您可以使用此方法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(); 
+0

好了,但如果我输入“AAA”,则量必须是26 + 26 + 26 在你的情况下,他把量只有26,而不是78 – George

+0

@George的“AAA”的文字:你的避风港在你的问题中没有解释;) –

+0

我知道这有点复杂? – George

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语法来简化事情。请注意,这也是命名元组属性,所以它们不使用默认的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);