1

我刚刚创建了一个简单的方法来计算字符串中每个字符的出现次数,而不考虑大写。

static List<int> charactercount(string input)
        {
            char[] characters = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
            input = input.ToLower();

            List<int> counts = new List<int>();
            foreach (char c in characters)
            {
                int count = 0;
                foreach (char c2 in input) if (c2 == c)
                    {
                        count++;
                    }

                counts.Add(count);
             }

            return counts;

        }

有没有更简洁的方法来做到这一点(即不创建一个字符数组来保存字母表中的每个字符),它也会考虑到数字、其他字符、大写字母等?

4

4 回答 4

2

从概念上讲,我更愿意返回Dictionary<string,int>计数。我假设可以通过省略而不是显式计数 0 来知道一个字符出现零次,您可以通过 LINQ 做到这一点。@Oded 为您提供了如何做到这一点的良好开端。您需要做的就是将 替换Select()ToDictionary( k => k.Key, v => v.Count() )。请参阅我对他关于进行不区分大小写分组的回答的评论。注意:你应该决定你是否关心字符的文化差异,并ToLower相应地调整方法。

您也可以在没有 LINQ 的情况下执行此操作;

public static Dictionary<string,int> CountCharacters(string input)
{
     var counts = new Dictionary<char,int>(StringComparer.OrdinalIgnoreCase);

     foreach (var c in input)
     {
          int count = 0;
          if (counts.ContainsKey(c))
          {
              count = counts[c];
          }
          counts[c] = counts + 1;
     }

     return counts;
}

请注意,如果您想要一个Dictionary<char,int>,您可以通过创建一个不区分大小写的字符比较器并将其用作IEqualityComparer<T>所需类型的字典来轻松做到这一点。为了简单起见,我string在示例中使用了它。

同样,调整比较器的类型以与您想要处理文化的方式保持一致。

于 2012-12-22T19:33:22.377 回答
1

使用GroupBySelect

aString.GroupBy(c => c).Select(g => new { Character = g.Key, Num = g.Count() })

返回的匿名类型列表将包含每个字符以及它在字符串中出现的次数。

然后,您可以使用定义的静态方法以任何您希望的方式过滤它Char

于 2012-12-22T19:12:38.120 回答
0

您的代码有点慢,因为您正在循环范围 az 而不是仅循环输入。

如果您只需要计算字母(如您的代码所示),那么最快的方法是:

int[] CountCharacters(string text)
{
    var counts = new int[26];

    for (var i = 0; i < text.Length; i++)
    {
        var charIndex - text[index] - (int)'a';
        counts[charIndex] = counts[charindex] + 1;
    }

    return counts;
}  

请注意,您需要添加一些内容,例如验证字符是否在范围内,并在需要时将其转换为小写,否则此代码可能会引发异常。我会把这些留给你补充。:)

于 2012-12-22T19:36:23.767 回答
0

基于 +Ran 对避免的回答IndexOutOfRangeException

static readonly int differ = 'a';
int[] CountCharacters(string text) {
    text = text.ToLower();
    var counts = new int[26];

    for (var i = 0; i < text.Length; i++) {
        var charIndex = text[i] - differ;
        // to counting chars between 'a' and 'z' we have to do this:
        if(charIndex >= 0 && charIndex < 26)
            counts[charIndex] += 1;
    }
    return counts;
}

实际上,使用Dictionary和/或LINQ在计算字符和使用低级数组时不够优化。

于 2012-12-22T20:28:57.993 回答