2017-06-28 52 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);