从字符串中读取字符并计数每个字符

时间:2018-11-06 21:57:51

标签: c# arrays list dictionary

我的代码存在以下问题:我无法理解如何阅读每个字符并在每个轮换结束时为每个人总结一个 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}");
        }
    }
}

我在这里阅读字典中一个字符串存在多少次。上面写的,我需要得到的是不同的。请帮忙,谢谢!

2 个答案:

答案 0 :(得分:2)

String.Split()默认在新行上分割,因此characters包含单个字符串,其中包含整行。如果您想要每个字符,只需除去Split(并将Dictionary KeyType更改为char以匹配值)即可:

SortedDictionary<char, int> text = new SortedDictionary<char, int>();
char[] characters = Console.ReadLine().ToArray();
// ...

https://www.ideone.com/hnMSv1

由于string实现了IEnumerable<char>,因此您实际上甚至不需要将字符转换为数组:

SortedDictionary<char, int> text = new SortedDictionary<char, int>();
string line = Console.ReadLine();
foreach( char character in line )
// ...

https://www.ideone.com/nLyBfC

答案 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);