我们有一个程序可以显示一个字母在文本中重复的次数
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和其他按字母顺序
最后,得到他们的总和? 抱歉我的英文!!!
答案 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)
关于删除不需要的字符的问题:
我认为你最好只保留a
和z
之间的所有字符。您可以编写一个扩展方法来执行此操作,并同时转换为小写:
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命名元组属性,因此它们不使用默认的Item1
和Item2
。
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);