Удаление похожих символов в строке - PullRequest
0 голосов
/ 22 декабря 2009

Есть ли какой-нибудь встроенный метод для удаления похожих символов в строке?
Примеры:

aaaabbbccc ->  abc
aabbccaa -> abc

Спасибо

Ответы [ 6 ]

6 голосов
/ 22 декабря 2009

Решает ли что-то подобное вашу проблему?

string distinct = new string("aaaabbbccc".Distinct().ToArray());

Это немного уродливо, но вы можете обернуть это в метод расширения:

public static string UniqueChars(this string original)
{
    return new string(original.Distinct().ToArray());
}

Надеюсь, это поможет.

6 голосов
/ 22 декабря 2009

Вы можете использовать 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 голос
/ 22 декабря 2009

Используйте класс Regex :

Regex.Replace( "aaabbcc", @"(\w)\1+", "$1" )

приведет к

abc

Для получения дополнительной информации смотрите здесь .

EDIT:
С вы я редактировал ваш вопрос:

Regex.Replace( "acaabbccbaa", @"(\w)(?<=\1.+)", "" )

приведет к

acb

Этот паттерн использует отрицательный взгляд сзади, чтобы идентифицировать двойные символы и заменяет их ""

0 голосов
/ 22 декабря 2009

Поскольку вы специально спрашивали об удалении "похожих" символов, вы можете попробовать что-то вроде этого:

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();
        }
0 голосов
/ 22 декабря 2009

нет.

Но это можно легко сделать в цикле, помните, что вам нужно создать новую строку, вы не можете редактировать символ в существующей строке (вы можете сделать string.remove, но, скорее всего, это будет медленно и испортит ваш цикл).

поясню:

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
}
0 голосов
/ 22 декабря 2009

Я бы подумал, что вы хотите посмотреть на использование регулярных выражений. Для C # .NET это полезный сайт ...

http://www.regular -expressions.info / dotnet.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...