是否有任何内置方法可以删除字符串中的相似字符? 例子:
aaaabbbccc -> abc
aabbccaa -> abc
由于
答案 0 :(得分:6)
您可以使用HashSet
并为此构建扩展方法:
static string RemoveDuplicateChars(this string s)
{
HashSet<char> set = new HashSet<char>();
StringBuilder sb = new StringBuilder(s.Length);
foreach (var c in s)
{
if (set.Add(c))
{
sb.Append(c);
}
}
return sb.ToString();
}
或使用Enumerable.Distinct
,只需:
Console.WriteLine(new string("aaabbbccaddcacc".Distinct().ToArray()));
答案 1 :(得分:6)
这样的事情可以解决你的问题吗?
string distinct = new string("aaaabbbccc".Distinct().ToArray());
这有点难看,但你可以把它包装成扩展方法:
public static string UniqueChars(this string original)
{
return new string(original.Distinct().ToArray());
}
希望这有帮助。
答案 2 :(得分:1)
使用Regex类:
Regex.Replace( "aaabbcc", @"(\w)\1+", "$1" )
将导致
abc
有关更多信息,请here。
修改强>
由于你我编辑了你的问题:
Regex.Replace( "acaabbccbaa", @"(\w)(?<=\1.+)", "" )
将导致
acb
此模式使用负面的lookbehind来识别双重字符并将其替换为""
答案 3 :(得分:0)
我原本以为你想看看使用正则表达式。对于C#.NET,这是一个有用的网站...
答案 4 :(得分:0)
没有
但是可以很容易地在一个循环中进行,记住你需要构建一个新的字符串,你不能在现有的字符串中编辑一个字符串(你可以做string.remove,但很可能会很慢并弄乱你的循环)。
basicly:
for(int i=0;i<MyText.Length;i++)
{
if(i == 0)
contiune;
if(Text[i] == Text[i - 1])
// Do something, both chars are the same
}
答案 5 :(得分:0)
由于您特别询问有关删除“类似”字符的问题,您可能需要尝试以下内容:
using System.Globalization;
....
private string RemoveDuplicates(string text)
{
StringBuilder result = new StringBuilder();
string previousTextElement = string.Empty;
TextElementEnumerator textElementEnumerator = StringInfo.GetTextElementEnumerator(text);
textElementEnumerator.Reset();
while (textElementEnumerator.MoveNext())
{
string textElement = (string)textElementEnumerator.Current;
if (string.Compare(previousTextElement, textElement, CultureInfo.InvariantCulture,
CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace |
CompareOptions.IgnoreWidth) != 0)
{
result.Append(textElement);
previousTextElement = textElement;
}
}
return result.ToString();
}