在linq中使用GroupBy对字符串的字母进行分组

Jon*_*han 4 c# linq group-by

我试图进入文件中提取文件中的单词并将文件的字符串中的每个字母分组.分组应按其字母(a,b,c,d,等等)排序,然后计算每个字母并向控制台显示每个字母的计数,如下所示:

a:56 b:34 c:53 d:

所以我正在使用以下代码,但我不认为它按照我想要的方式工作,有没有人有任何想法?谢谢!

var text = System.IO.File.ReadAllText("file.txt");
        var upper = text.ToUpper();
        var alpha = upper.Where(char.IsLetter).ToArray();
        var grouped = alpha.GroupBy(i => i % 26);
        var a = grouped.First(g => g.Key == 0).Count();
Run Code Online (Sandbox Code Playgroud)

Jak*_*rtz 5

你需要一个Select后来GroupBy获得你需要的结果:

var result = text
    .ToUpper()
    .Where(char.IsLetter)
    .GroupBy(c => c)
    .Select(g => new { Letter = g.Key, Count = g.Count() });
Run Code Online (Sandbox Code Playgroud)

然后,"a: 56 b: 34 c: 53"您可以使用string.Join和格式化结果string.Format:

string formattedResult = string.Join(" ", result.Select(x => string.Format("{0}: {1}", x.Letter, x.Count)));
Run Code Online (Sandbox Code Playgroud)


And*_*yak 3

像这样的东西应该有效:

var text = System.IO.File.ReadAllText("file.txt");
var dictionary = new Dictionary<char,int>();
//count every letter
foreach (var symbol in text)
{
    //skip non letter characters
    if (!char.IsLetter(symbol))
         continue;

    var key = char.ToLower(symbol);
    if (dictionary.ContainsKey(key))
         dictionary[key]++;
    else
         dictionary.Add(key,1);
}
//result output
foreach (var pair in dictionary.OrderBy(p => p.Key))
{
    Console.Write("{0}: {1} ", pair.Key, pair.Value);
}
Run Code Online (Sandbox Code Playgroud)

这不是最小的解决方案,但比在资源使用方面分组更好。