在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();
在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.Join
和string.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(' ')
,以获得包含单个单词的字符串序列。
然后你可以按照每个单词中的第一个字母进行分组。