如何在字符串中查找每个不同的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)
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)
您可以使用正则表达式:
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查询将执行此操作:
现在,上述解决方案仍有效,但还有其他方法可以做到这一点.如果要检测的模式比"相同的字符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()长度,然后我们可以简单地从每个组构造新的字符串.