我的代码存在以下问题:我无法理解如何阅读每个字符并在每个轮换结束时为每个人总结一个 int 。 这是我的代码:
class Program
{
static void Main()
{
SortedDictionary<string, int> text = new SortedDictionary<string, int>();
string[] characters = Console.ReadLine()
.Split()
.ToArray();
foreach (var character in characters)
{
if (text.ContainsKey(character))
{
text[character]++;
}
else
{
text.Add(character, 1);
}
}
foreach (var character in text)
{
Console.WriteLine($"{character.Key} -> {character.Value}");
}
}
}
我在这里阅读字典中一个字符串存在多少次。上面写的,我需要得到的是不同的。请帮忙,谢谢!
答案 0 :(得分:2)
String.Split()
默认在新行上分割,因此characters
包含单个字符串,其中包含整行。如果您想要每个字符,只需除去Split
(并将Dictionary KeyType更改为char
以匹配值)即可:
SortedDictionary<char, int> text = new SortedDictionary<char, int>();
char[] characters = Console.ReadLine().ToArray();
// ...
由于string
实现了IEnumerable<char>
,因此您实际上甚至不需要将字符转换为数组:
SortedDictionary<char, int> text = new SortedDictionary<char, int>();
string line = Console.ReadLine();
foreach( char character in line )
// ...
答案 1 :(得分:2)
您可以在这里使用LINQ,因为任何字符串都由char元素组成。因此,字符串类型实现了IEnumerable<char>
接口:
string str = "aaabbc";
var res = str
.GroupBy(c => c)
.ToDictionary(g => new { g.Key, Count = g.Count() });
下面的示例演示了如何在不强制转换为字典的情况下获取它,而是投影一个匿名类型并按降序对字符数进行排序:
var res2 = str
.GroupBy(c => c)
.Select(d => new { d.Key, Count = d.Count() })
.OrderByDescending(x => x.Count);