如何从c#中的字符串中读取char

时间:2012-08-07 19:52:31

标签: c#

我有一个字符串a = "aabbbffdshhh"。我想写一个程序,它会给我"a2b3f2d1s1h3"的输出。我想返回现在的字母表中的每个字母,这是重要的。

我目前使用的代码是:

int cnta;int cntb; int cntf; int cnth;

for (int i=0;i<a.lenghth;i++)
{
   if(a[i]=='a')
   {
      cnta++;
   }
   if(a[i]=='b')
   {
      cntb++;
   }
   if(a[i]=='h')
   {
   cnth++;
   }
}

它给了我输出但这个逻辑不好。我可以使用哪些其他算法或方法?

10 个答案:

答案 0 :(得分:11)

这应该为您提供结果所需的所有数据。

如果您需要该格式的结果,您应该能够将它们附加到字符串中(使用StringBuilder)。

var results = s.GroupBy(c => c)
    .Select(group => new
    {
        Letter = group.Key,
        Count = group.Count()
    });

答案 1 :(得分:1)

一个想法是让List<Tuple<char,int>>预先填充每个char0

遇到时增加每个字符的值。

for (int i=0;i<a.lenghth;i++)
{
  myList.Single(t => t.Item1 == a[i]).Item2++;
}

答案 2 :(得分:1)

概括而言:

  1. 对字符进行排序以获取具有每个char的1个实例的排序列表
  2. 创建一个与排序列表大小相同的计数器列表(每个计数器从0开始)
  3. 循环遍历corosponding计数器的字符串中的每个字符
  4. 遍历排序列表,构建排序列表和计数器的结果。

答案 3 :(得分:1)

var input = "aabbbffdshhh";

var characters = input.ToArray();

StringBuilder sb = new StringBuilder();
characters.ToList().ForEach(c=>{if(!sb.ToString().Contains(c)){sb.Append(c); sb.Append(characters.ToList().Count(cc=>cc == c));}});

//sb.ToString().Dump(); //output is a2b3f2d1s1h3

在LinqPad中完成

答案 4 :(得分:1)

使用Dictionary类型的字典。在第一次出现时,在每个后续增量中添加到字典中。

这样你可以使用你想要的任何字符(并控制如何处理案例),而不仅仅是处理26

答案 5 :(得分:1)

假设你正在做Run-length Encoding的轻微变化,这将对你的字符串进行编码。我的评论没有得到答复,所以我认为这是一个猜测。我会将解码作为练习留给您(或者只是查看rosettacode以查看实现)。

var a = "aabbbffdshhh";
var rle = new StringBuilder();

var last = a[0];
var count = 1;
for (int i = 1; i < a.Length; i++)
{
    if (a[i] != last)
    {
        rle.AppendFormat("{0}{1}", last, count);
        last = a[i];
        count = 0;
    }

    count++;
}

rle.AppendFormat("{0}{1}", last, count);

Assert.AreEqual("a2b3f2d1s1h3", rle.ToString());

答案 6 :(得分:1)

可以用1行超级可读代码(讽刺)完成:-)我已经添加了一个orderby,即使没有请求,你也可以删除它。

        string a = "aaaadjkhsdfkjsdjkfhsdkjff";
        var res = a.GroupBy(c => c).OrderBy(g => g.Key).Aggregate("", (p, g) => p += g.Key + g.Count().ToString());

或者如果你是那些认为字符串连接效率太低的人之一

        var res2 = a.GroupBy(c => c).OrderBy(g => g.Key).Aggregate(new StringBuilder(), (p, g) => p.Append(g.Key + g.Count().ToString())).ToString();;

答案 7 :(得分:0)

试试这个:

        string a = "aaabbbasdlfjasldfkjalsdkfjaewoasdfj";

        //store character counts in a dictionary 
        Dictionary<char, int> charCounts = new Dictionary<char, int>();

        //iterate through string and place counts in dictionary
        for (int i = 0; i < a.Length; i++)
        {
            if (!charCounts.Keys.Contains(a[i]))
            {
                charCounts[a[i]] = 1;
            }
            else
            {
                charCounts[a[i]] += 1;
            }
        }

        //output sorted list
        foreach (char letter in charCounts.Keys.OrderBy(x => x))
        {
            Console.Write(string.Format("{0}{1}", letter, charCounts[letter]));
        }

答案 8 :(得分:0)

在C#中你可以做到:

Dictionary<char, int> d = new Dictionary<char, int>();
foreach(char c in a){
    if(d.ContainsKey(c)){
        d[c] = d[c] + 1;
    } else {
        d[c] = 1;
    }
}
StringBuilder sb = new StringBuilder();
foreach(KeyValuePair p in d){
    sb += p.Key.ToString() + p.Value.Tostring();
}
return sb.ToString();

答案 9 :(得分:-1)

此代码应该在cpp中工作

int* count = new int[26];
for (int i = 0; i < a.length; i++)
  count[a[i] - 'a']++;
在c#中你需要玩一点,所以你好好把char看成一个数字。