我编写了一些使用SortedDictionary来计算字符串中字符出现次数的代码。
如何改进这段代码?我该怎么做?任何建议都是有帮助的。
static void Main(string[] args)
{
string longText = @"The quick brown fox jumps over the lazy dog";
var count = CharacterCount.Count(longText);
foreach (var character in count)
{
Console.WriteLine("{0} - {1}", character.Key, character.Value);
}
}CharacterCount类:
class CharacterCount
{
public static SortedDictionary<char, ulong> Count(string stringToCount)
{
SortedDictionary<char, ulong> characterCount = new SortedDictionary<char, ulong>();
foreach (var character in stringToCount)
{
if (!characterCount.ContainsKey(character))
{
characterCount.Add(character, 1);
}
else
{
characterCount[character]++;
}
}
return characterCount;
}这是输出:

发布于 2014-09-25 15:27:23
您也可以使用林克做同样的事情:
var counts = longText.GroupBy(c => c) // put each character into a "bucket"
// order the buckets alphabetically
.OrderBy(c => c.Key);
// then convert to dictionary where key = character, value = count
.ToDictionary(grp => grp.Key, grp => grp.Count()) 为了方便/可读性,可以将其转换为string上的扩展方法:
static class Extensions
{
public static Dictionary<char, int> CharacterCount(this string text)
{
return text.GroupBy(c => c)
.OrderBy(c => c.Key)
.ToDictionary(grp => grp.Key, grp => grp.Count());
}
}然后像这样调用它:
var longText = @"The quick brown fox jumps over the lazy dog";
var counts = longText.CharacterCount();但是,请注意,上面的内容不会产生一个排序字典,也就是说,如果您以后要向它添加另一个键/值,那么顺序将不再被维护。此时您可以重新排序,也可以使用这SortedDictionary构造函数创建排序字典。
发布于 2014-09-25 15:48:57
您可以去掉count变量,因为这里并不真正需要它,只会给main方法增加混乱,您只需在foreach声明中调用.Count方法。
所以这个:
static void Main(string[] args)
{
string longText = @"The quick brown fox jumps over the lazy dog";
var count = CharacterCount.Count(longText);
foreach (var character in count)
{
Console.WriteLine("{0} - {1}", character.Key, character.Value);
}
}变成这样
static void Main(string[] args)
{
string longText = @"The quick brown fox jumps over the lazy dog";
foreach (var character in CharacterCount.Count(longText))
{
Console.WriteLine("{0} - {1}", character.Key, character.Value);
}
}发布于 2014-09-25 19:03:07
在您的ulong中使用SortedDictionary<T,TK>,这表示最大值18,446,744,073,709,551,615,这对您的情况来说似乎有点过分。我很肯定一个int就足够了,因为最大值是2,147,483,647。
另外,您的方法名为Count,很难假设它将返回一个SortedDictionary<char,ulong>。我认为它将返回一个int,因为在.Net框架中名为Count的所有方法。您可以将其命名为GetNumberOfOccurencePerCharacter,否则Count似乎将返回string中的字符数,而不是每个字符在string中出现的次数。
https://codereview.stackexchange.com/questions/63872
复制相似问题