class Program
{
static void Main(string[] args)
{
string str = "AAAABBBBBBBCCCCCMMMMMMMNadcdfss";
Dictionary<char, int> dic = new Dictionary<char, int>();
for (int i = 0; i < str.Length; i++)
{
//如果key已经包含了某个字符 则不再添加 让它的value加一
if (dic.Keys.Contains(str[i]))
{
dic[str[i]]++;
}
else
{
//不包含 则添加到字典中 并设置value为1
dic.Add(str[i], 1);
}
}
foreach (KeyValuePair<char,int> item in dic)
{
Console.WriteLine("{0}出现了{1}次",item.Key,item.Value);
}
Console.Read();
}
}
结果:
希望能帮到你
谢谢您的回答,那如果把字符串改成“AAAABBBBBBBCCCCCAAAAAAA”呢?
想要的结果是
AAAA出现1次,
BBBBBBB出现1次,
CCCCC出现1次,
AAAAAAA出现1次
需求我没理清楚,望大神指教
@小也:
//如果key已经包含了某个字符 则不再添加 让它的value加一
if (!dic.Keys.Contains(str[i]))
{
//不包含 则添加到字典中 并设置value为1
dic.Add(str[i], 1);
}
把这个地方改一下 就可以了
@wolfy:
string str = "AAAABBBBBBBCCCCCMMMMMMMNadcdfssAAAA";
Dictionary<string, int> dic = new Dictionary<string, int>();
string tempString = string.Empty;
string tempChar = string.Empty;
for (int i = 0; i < str.Length; i++)
{
if (tempChar == str[i].ToString())
{
//tempString += str[i].ToString();
}
else
{
tempChar = str[i].ToString();
if (!string.IsNullOrEmpty(tempString))
{
//如果key已经包含了某个字符 则不再添加 让它的value加一
if (dic.Keys.Contains(tempString))
{
dic[tempString]++;
}
else
{
//不包含 则添加到字典中 并设置value为1
dic.Add(tempString, 1);
}
tempString = string.Empty;
}
}
tempString += tempChar;
//最后一次循环的结果添加入字典
if (i == str.Length - 1)
{
//如果key已经包含了某个字符 则不再添加 让它的value加一
if (dic.Keys.Contains(tempString))
{
dic[tempString]++;
}
else
{
//不包含 则添加到字典中 并设置value为1
dic.Add(tempString, 1);
}
}
}
foreach (KeyValuePair<string, int> item in dic)
{
Console.WriteLine("{0}出现了{1}次", item.Key, item.Value);
}
Console.Read();
你应该这样想,字符串其实就是一个一个的字符拼接的,你把他还原成字符数组,使用linq的groupby 不就出来了
string str="aaabbbbbbbbccccccccccc";
char[] c=str.tochars();
后面linq的groupby
刚没看清,你要的是连续出现的次数,思路大致一样,转成字符数组,循环数组,取第一个比较,相同加一,不同时……呵呵,后面我想就不用我说了吧
我就说一下思路吧~最好呢就是先把这整个字符串排好序,那么所有相同的字符都会靠在一起,然后用一个for循环从第一个遍历,遇到一个新的字符开始为当前字符计数直到遇到新的另外一个字符,那么如此类推就可以得出答案了。