我必须在字符串中随机生成字母
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;
这是什么意思?我该如何解决这个问题?
答案 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);
}
}
}