1

我必须在字符串中随机生成字母

this.text = "";
Random rndChar = new Random();

for (int i = 0; i < 50; i++)
{
    this.text = this.text + (char)rndChar.Next(65,91);
}

结果是关于 GUHZBVUTSUZHBF...

现在我必须生成一个按升序排列的字符列表,其中每个字符重复的次数。我试过了

SortedList letters = new SortedList();
for(int i = 0; i < 50; i++)
{
    letters.Add(this.text[i], i);
}

foreach (Char entry in letters.Values)
    Console.WriteLine(entry);

,但这不起作用:

“System.ArgumentException:'项目已添加。在字典中键入:'J' 正在添加键:'J''。”

这意味着什么?我该如何解决这个问题?

4

1 回答 1

1

正如评论中所指出的,SortedList这里引起问题的原因是它实际上是一个dictionary,尽管它的名字。你不能Add用同一个键调用两次。(您可以使用索引器为键设置新值,无论它以前是否存在,但Add检查是否已经存在该键的值。)

可以使用SortedList它的排序性,但将计数保留在值中。不过,这比它需要的要难。我会为此使用 LINQ - 它可以很容易地完成这两个方面。

var orderedGroups = text
   .GroupBy(c => c, (c, g) => new { Letter = c, Count = g.Count() })
   .OrderBy(g => g.Key);

foreach (var element in orderedGroups)
{
    Console.WriteLine(element);
}

实际上,它还使第一部分的执行变得更容易 - 不需要for循环和字符串连接。这是一个完整的例子:

using System;
using System.Linq;

public class Program
{
    static void Main()
    {
        Random rng = new Random();
        var letters = Enumerable.Range(0, 50)
            .Select(_ => (char) rng.Next(65,91))
            .ToArray();

        Console.WriteLine($"Letters: {new string(letters)}");
        var orderedGroups = letters
            .GroupBy(c => c, (c, g) => new { Letter = c, Count = g.Count() })
            .OrderBy(g => g.Key);

        foreach (var element in orderedGroups)
        {
            Console.WriteLine(element);
        }
    }
}
于 2018-05-02T18:41:28.277 回答