C# 遍历列表以查找字符数

问题描述

我正在尝试遍历字符串以查找字符、ASCII 值和字符出现的次数。到目前为止,我已经使用 foreach 语句找到了每个唯一的字符和 ASCII 值,并查找该值是否已经在列表中,然后不要添加它,否则添加它。但是,我正在努力解决计数部分。我在想逻辑是“如果我已经在列表中,不要再计算我,但是,增加我的频率” 我尝试了一些不同的方法,例如尝试找到它找到的字符的索引并将其添加到该特定索引中,但我迷路了。

db.coll.aggregate(
[
  {
    $sort:{ country: -1,"quantity": -1 }
  },{
    "$group":
    {
      "_id":{ "country": "$country" },"data":{ "$first": "$$ROOT" } 
    }
  }
])

}

解决方法

我不确定我是否理解您的问题,但您正在寻找的可能是 Dictionary 而不是 List。以下是我认为您试图解决的问题的解决方案示例。

统计字符出现频率

Dictionary<int,int> frequency = new Dictionary<int,int>();                
            foreach (int j in String)
            {
                if (frequency.ContainsKey(j))
                {
                    frequency[j] += 1;
                }
                else
                {
                    frequency.Add(j,1);
                }
            }

将字符链接到它们的 ASCII 的方法

Dictionary<char,int> ASCIIofCharacters = new Dictionary<char,int>();

        foreach (char i in String)
        {
            if (ASCIIofCharacters.ContainsKey(i))
            {

            }
            else
            {
                ASCIIofCharacters.Add(i,(int)i);
            }
        }
,

一个简单的 LINQ 方法是:

string String = "hello my name is lauren";

var results =
    String
        .GroupBy(x => x)
        .Select(x => new { character = x.Key,ascii = (int)x.Key,frequency = x.Count() })
        .ToArray();

这给了我:

results

,

如果我理解您的问题,您想将所提供字符串中的每个 char 映射到它在字符串中出现的次数,对吗?

如果是这样,有很多方法可以做到这一点,您还需要选择要存储结果的数据结构。

假设您想使用 linq 并将结果存储在 Dictionary<char,int>, 中,您可以执行以下操作:

static IDictionary<char,int> getAsciiAndFrequencies(string str) {
  return (
    from c in str
    group c by Convert.ToChar(c)
  ).ToDictionary(c => c.Key,c => c.Count());
}

如果这样使用:

var f = getAsciiAndFrequencies("hello my name is lauren");
// result: { h: 1,e: 3,l: 3,o: 1,... }
,

您正在创建直方图。但是您不应该使用 List.Contains,因为它会随着列表的增长而变得无效。你必须一个接一个地浏览列表。最好使用基于散列的 Dictionary 并直接转到项目。代码可能是这样的

string str = "hello my name is lauren";

var dict = new Dictionary<char,int>();
foreach (char c in str)
{
    dict.TryGetValue(c,out int count);
    dict[c] = ++count;
}

foreach (var pair in dict.OrderBy(r => r.Key))
{
    Console.WriteLine(pair.Value + "x " + pair.Key + " (" + (int)pair.Key + ")");
}

给出

4x   (32)
2x a (97)
3x e (101)
1x h (104)
1x i (105)
3x l (108)
2x m (109)
2x n (110)
1x o (111)
1x r (114)
1x s (115)
1x u (117)
1x y (121)