c # Самый быстрый способ удалить лишние пробелы - PullRequest
41 голосов
/ 22 июня 2011

Какой самый быстрый способ заменить лишние пробелы одним пробелом?
Например,

из

foo      bar 

до

foo bar

Ответы [ 25 ]

1 голос
/ 22 июня 2011

вы можете использовать indexOf, чтобы сначала получить место, где начинаются пробельные последовательности, а затем использовать метод replace, чтобы изменить пробел на "".Оттуда вы можете использовать индекс, который вы взяли, и поместить один пробельный символ в это место.

1 голос
/ 24 марта 2015
public string GetCorrectString(string IncorrectString)
    {
        string[] strarray = IncorrectString.Split(' ');
        var sb = new StringBuilder();
        foreach (var str in strarray)
        {
            if (str != string.Empty)
            {
                sb.Append(str).Append(' ');
            }
        }
        return sb.ToString().Trim();
    }
1 голос
/ 06 июня 2014

Это забавно, но на моем ПК описанный ниже метод такой же быстрый, как и подход StringBulder Сергея Поваляева - (~ 282 мс для 1000 повторений, 10 тыс. Строк src).Не уверен насчет использования памяти.

string RemoveExtraWhiteSpace(string src, char[] wsChars){
   return string.Join(" ",src.Split(wsChars, StringSplitOptions.RemoveEmptyEntries));
}

Очевидно, что он работает нормально с любыми символами - не только с пробелами.

Хотя это не то, что запросил ОП - но если это то, что вам действительно нужночтобы заменить определенные последовательные символы в строке только одним экземпляром, вы можете использовать этот относительно эффективный метод:

    string RemoveDuplicateChars(string src, char[] dupes){  
        var sd = (char[])dupes.Clone();  
        Array.Sort(sd);

        var res = new StringBuilder(src.Length);

        for(int i = 0; i<src.Length; i++){
            if( i==0 || src[i]!=src[i-1] || Array.BinarySearch(sd,src[i])<0){
                res.Append(src[i]); 
            }
        }
        return res.ToString();
    }
0 голосов
/ 11 июля 2016

Это очень просто, просто используйте метод .Replace():

string words = "Hello     world!";
words = words.Replace("\\s+", " ");

Вывод >>> "Hello world!"

0 голосов
/ 22 ноября 2014

Нет необходимости в сложном коде! Вот простой код, который удалит все дубликаты:

public static String RemoveCharOccurence(String s, char[] remove)
{
    String s1 = s;
    foreach(char c in remove)
    {
        s1 = RemoveCharOccurence(s1, c);
    }

    return s1;
}

public static String RemoveCharOccurence(String s, char remove)
{
    StringBuilder sb = new StringBuilder(s.Length);

    Boolean removeNextIfMatch = false;
    foreach(char c in s)
    {
        if(c == remove)
        {
            if(removeNextIfMatch)
                continue;
            else
                removeNextIfMatch = true;
        }
        else
            removeNextIfMatch = false;

        sb.Append(c);
    }

    return sb.ToString();
}
...