按排序列表排序的随机字母C#

时间:2018-05-02 18:23:16

标签: c# sortedlist alphabetic

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

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

,但这不起作用:

  

&#34; System.ArgumentException:&#39;项目已添加。键入字典:&#39; J&#39;重点补充:&#39; J&#39;&#39;   &#34;

这是什么意思?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

正如评论中所述,SortedList导致问题的原因是,它实际上是一个字典,尽管名称如此。您无法使用相同的密钥两次拨打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);
        }
    }
}