字母表中的字母数。 C#

时间:2016-01-15 16:03:09

标签: c#

我需要做这个程序,计算字母表中每个字母出现多少(由用户输入)。我尝试为每个字母使用枚举,并且每个循环都检查它是哪个字母,并相应地增加。但是我做错了,循环中有一些语法错误:

  

“'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]++;
                }
            }
    }
}

5 个答案:

答案 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来保存配对(charint

        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”。

然后我们将这些组转换成字典,在这个例子中,它将单个字符(即“o”)映射到一个数字(它出现的次数),即2。

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