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

本文关键字:字符串 linq GroupBy | 更新日期: 2023-09-27 18:28:22

我正试图进入一个文件,提取文件中的单词,并将文件字符串中的每个字母分组。分组应该按字母(a、b、c、d等)排序,然后计算每个字母,并向控制台显示每个字母的计数,类似于以下内容:

a: 56b: 34c: 53d:

所以我正在使用以下代码,但我认为它没有按照我希望的方式工作,有人有什么想法吗?谢谢

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();

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

GroupBy之后需要一个Select才能获得所需的结果:

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

然后,要将结果格式化为"a: 56 b: 34 c: 53",可以使用string.Joinstring.Format:

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

这样的东西应该可以工作:

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);
}

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

您操作的是字母,而不是单词。

您需要Split(' '),以获得包含单个单词的字符串序列。

然后你可以按照每个单词中的第一个字母进行分组。