我需要做这个程序,计算字母表中每个字母出现多少(由用户输入)。我尝试为每个字母使用枚举,并且每个循环都检查它是哪个字母,并相应地增加。但是我做错了,循环中有一些语法错误:
“'Program.Alphabet是一种类型,在给定的上下文中无效”。
我做错了什么?有没有更好的方法来解决/改善它。在本练习中,我们不能使用数组或特殊计数函数。非常感谢。
class Program
{
enum Alphabet
{
a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0,
h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0,
o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0,
v = 0, w = 0, x = 0, y = 0, z = 0
}
static void Main(string[] args)
{
Console.WriteLine("Enter here your sentence: ");
string input = Console.ReadLine();
for (int i = 0; i < input.Length; i++)
{
for (int x = 0; x < 25; i++)
if (input[i] == Alphabet[x])
{
Alphabet[x]++;
}
}
}
}
答案 0 :(得分:3)
Dictionary<TKey,TValue>
最适合这里,您可以通过以下几种方式完成:
Dictionary<Char,int> alphabets = new Dictionary<Char,int>();
for (int i = 0; i < input.Length; i++)
{
char character= input[i];
if(Char.IsLetter(character)) // this is important user can enter numbers as well
{
if(alphabets.ContainsKey(character)) // if letter already in increment count
alphabets[character] = alphabets[character] + 1;
else
alphabets.Add(character,1); // else add in dictionary
}
}
以下是Linq inpired解决方案:
var result = input.Where(character => Char.IsLetter(character))
.GroupBy(alphabet=>alphabet)
.Select(alphabet=> new
{
Letter = alphabet.Key,
Count = alphabet.Count()
});
答案 1 :(得分:3)
您应该使用Dictionary
而不是enum
来保存配对(char
,int
)
Dictionary<char, int> countDictionary = new Dictionary<char, int>();
foreach (var c in input.ToLower())
{
if (!countDictionary.ContainsKey(c))
{
countDictionary.Add(c, 0);
}
countDictionary[c]++;
}
答案 2 :(得分:1)
编辑:对不起,刚注意到:
对于本练习,我们不能使用数组或特殊计数功能。非常感谢。
在这种情况下,听起来这个解决方案可能不适合您的问题?无论哪种方式,这听起来像一个非常特殊的运动!让我看看如果没有收藏,我能否找到实现这一目标的最差方法。
使用LINQ的另一个词典示例:
Dictionary<char, int> characterCount = input.ToLower()
.Where(c => Char.IsLetter(c))
.GroupBy(c => c)
.ToDictionary(k => k.Key, v => v.Count());
打破每次通话:
ToLower()
会将整个字符串转换为小写字母 - 因此我们将'A'和'a'视为同一个字符。
Where(c => Char.IsLetter(c))
会导致我们忽略任何非字母字符(例如“!”)。
GroupBy(c => c)
将所有角色组合在一起。因此,如果字符串是“Moo”,那么将创建两个组。一组中包含“m”键和一个“m”键,第二组中键为“o”,其中包含两个“o”。
ToDictionary(k => k.Key, v => v.Count())
从每个组创建一个键值对,键是字符,值(数字)是该组中元素的数量(该字符的总数)。
答案 3 :(得分:0)
你只是误用了枚举。我建议你将这个枚举转换成一个简单的数组或字典,你的代码就可以正常工作,就像下面的代码一样:
var alphabets = new Dictionary<char, int>()
{
{'a', 0},{'b', 0},{'c', 0},{'d', 0},
{'e', 0},{'f', 0}, {'g', 0},{'h', 0},
{'i', 0},{'g', 0},{'k', 0}, {'l', 0},
{'m', 0},{'m', 0},{'o', 0},{'p', 0},
{'k', 0},{'r', 0},{'s', 0},{'t', 0},
{'w', 0},{'x', 0}, {'y', 0},{'z', 0},
};
Console.WriteLine("Enter here your sentence: ");
string input = Console.ReadLine();
for (int i = 0; i < input.Length; i++)
{
if (alphabets.ContainsKey(char.ToLower(input[i])))
{
alphabets[char.ToLower(input[i])]++;
}
}
答案 4 :(得分:0)
只需使用LINQ ...
var results = input.Where(c=>char.IsLetter(c))
.GroupBy(i => i)
.ToDictionary(k => k.Key, v => v.Count());
...如果你不能使用.Count()
,你总是可以写自己的......
public static class Tools
{
public static int MyCount(this IEnumerable set)
{
if (set == null)
return 0;
var enumerator = set.GetEnumerator();
var cnt = 0;
while (enumerator.MoveNext())
cnt++;
return cnt;
}
}
...如果你真的想惹恼你的老师/同学,那么就这样做......
public static IDictionary<char, int> CountStuff(this string set)
{
var results = new Dictionary<char, int>();
if (set == null)
goto bottom;
var enumerator = set.GetEnumerator();
top:
if (enumerator.MoveNext())
{
var v = (int)enumerator.Current;
if (v < 97)
v = v + 96;
var c = (char)v;
if (v < 97 || v > 122)
goto top;
if (results.ContainsKey(c))
results[c]++;
else
results.Add(c, 1);
goto top;
}
bottom:
return results;
}