C#String对不同字符的操作

use*_*761 0 c# string

如何在字符串中查找每个不同的char并将其显示在新行中,例如:

string ex = "aabbbbchhhhaaaacc";
Run Code Online (Sandbox Code Playgroud)

变为:

a: aaaaaa
b: bbbb
c: ccc
h: hhhh
Run Code Online (Sandbox Code Playgroud)

我知道我必须使用新的distinctn字符串并循环遍历字符串中的每个字符,但不知道如何继续.

string answer = new String(input.Distinct().ToArray());
                foreach (char c in answer)
                {
                   //what code goes here?
                }
Run Code Online (Sandbox Code Playgroud)

Pho*_*cUK 8

void Main()
{
    string ex = "aabbbbchhhhaaaacc";
    var chars = ex.ToCharArray().Distinct();
    foreach (var c in chars)
    {
        Debug.WriteLine("{0}: {1}", c, new String(c, ex.Where(ch => ch == c).Count()));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

a: aaaaaa
b: bbbb
c: ccc
h: hhhh
Run Code Online (Sandbox Code Playgroud)


ang*_*son 5

您可以使用正则表达式:

void Main()
{
    string ex = "aabbbbchhhhaaaacc";
    var re = new Regex(@"(.)\1*");
    var sequences =
        from Match ma in re.Matches(ex)
        let value = ma.Value
        group value by value[0] into g
        select g.Aggregate((s1, s2) => s1 + s2);

    foreach (var sequence in sequences)
        Debug.WriteLine(sequence);
}
Run Code Online (Sandbox Code Playgroud)

你可以在LINQPad中测试它,它会输出你想要的.

这是对表达式的解释:

(.)\1*
^-^^-^
 |  |
 |  +- says "0 or more times of the exact same character as in group 1"
 +- first group
Run Code Online (Sandbox Code Playgroud)

LINQ查询将执行此操作:

  1. 找到每个不同的角色出现
  2. 挑出这个序列的第一个(可能是唯一的)字符
  3. 按照第一个字符对所有出现进行分组(以便"a"的所有序列都在一个组中)
  4. 将每个组聚合在一起以获得每个完整序列

现在,上述解决方案仍有效,但还有其他方法可以做到这一点.如果要检测的模式比"相同的字符N次"复杂一点,那么正则表达式可能是最好的方式.

但是,你可以做的是利用这个事实,它是相同的角色:

void Main()
{
    string ex = "aabbbbchhhhaaaacc";
    var groups = ex
        .ToCharArray()
        .GroupBy(c => c);

    foreach (var group in groups)
        Debug.WriteLine(new string(group.Key, group.Count()));
}
Run Code Online (Sandbox Code Playgroud)

这将简单地创建包含每个字符的所有出现的组,其中group.Key是字符和group.Count()长度,然后我们可以简单地从每个组构造新的字符串.