Удалить пробелы в элементах в строке C# - PullRequest
6 голосов
/ 10 января 2020

У меня есть строка, которая содержит несколько элементов, разделенных запятыми:

 string RESULT =  "D_CA,     P_AMOUNT    ,D_SH,D_CU,D_TO,D_GO,D_LE,D_NU,D_CO,D_MU,D_PMU,D_DP,    P_COMMENT      ";

Как вы можете видеть, некоторые элементы содержат пробелы, Мой объект - удалить все пробелы, Это мой код:

    RESULT.Split(',').ToList().ForEach(p =>
        if (p.Contains(" "))
        {
               RESULT = RESULT.Replace(p, p.Trim());
        }
        });

И вот мой результат:

"D_CA,P_AMOUNT,D_SH,D_CU,D_TO,D_GO,D_LE,D_NU,D_CO,D_MU,D_PMU,D_DP,P_COMMENT"

это работает хорошо, но я спрашиваю, есть ли другой более оптимизированный способ получить тот же результат?

Ответы [ 9 ]

8 голосов
/ 10 января 2020

Полагаю, вам нужна строка с удаленными пробелами. Вы можете использовать String.Replace()

RESULT = RESULT.Replace(" ",string.Empty);

В качестве альтернативы вы также можете использовать Regex для замены,

RESULT = Regex.Replace(RESULT,@"\s",string.Empty);

Подход regex обеспечит замену всех пробельных символов включая табуляцию, пробел и т. д. c

7 голосов
/ 10 января 2020

Разве не то, что вы ищете?

var noWhiteSpaces = RESULT.Replace(" ", string.Empty);
7 голосов
/ 10 января 2020

См. ответ Павла Аниховского , который проверяет производительность всех предлагаемых решений и фактически показывает, что упрощенное решение LINQ не слишком сильно влияет на производительность - полезно знать :-).

Более простое решение с LINQ:

string.Join(string.Empty, input.Where(c=>!char.IsWhiteSpace(c)));

Сначала мы отфильтровываем все пробельные символы, а затем соединяем их в строку. Он имеет только одну строку (для создания результирующей строки) и обрабатывает все виды пробельных символов, а не только пробелы.

Оригинальный ответ

Используйте StringBuilder для построения результирующей строки а затем go через строку ввода с foreach, всегда проверяя char.IsWhiteSpace(character). Если символ не является пробелом, добавьте его в StringBuilder, вызвав метод Append(character). В конце просто верните получившуюся строку, вызвав ToString() для StringBuilder.

var builder = new StringBuilder();
foreach(var character in input)
{
   if (!char.IsWhiteSpace(character))
   {
      builder.Append(character);
   }
}
return builder.ToString();

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

5 голосов
/ 10 января 2020

Вы можете Trim():

var split = RESULT.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(s=> s.Trim());
4 голосов
/ 10 января 2020

Для этого можно использовать следующий метод расширения

public static class Ext
{
    public static string RemoveWhitespaces(this string input)
    {
        return new string(input.ToCharArray()
            .Where(c => !char.IsWhiteSpace(c))
            .ToArray());
    }
}

Пример использования

string RESULT = "D_CA,     P_AMOUNT    ,D_SH,D_CU,D_TO,D_GO,D_LE,D_NU,D_CO,D_MU,D_PMU,D_DP,    P_COMMENT      ";
RESULT = RESULT.RemoveWhitespaces();

Char.IsWhiteSpace Метод обозначает все пробельные символы Юникода.

Ниже приведен простой тест для всех предложенных решений. С точки зрения производительности обычный Replace - самый быстрый метод, но он не удаляет все пробельные символы. Решение с StringBuilder кажется наиболее актуальным с точки зрения производительности и функциональности, оно примерно в 2 раза быстрее, чем приведенное выше расширение. Regex и Linq решения в несколько раз медленнее, чем другие

enter image description here

3 голосов
/ 10 января 2020

Вы можете упростить код следующим образом:

RESULT.Replace(" ", string.Empty).Split(',');

Предполагая, что вам нужны элементы в Enumerable. В противном случае у вас должна работать только Replace ().

1 голос
/ 12 января 2020

Я могу только добавить, что вы можете поместить linq в метод stati c

public static class Utility
{
    public static string RemoveWhitespaces(this string input)
    {
        return string.Join(string.Empty, input.Where(c => !char.IsWhiteSpace(c)));
    }
}

и затем использовать его с любой вашей строкой:

Console.WriteLine("asdas asdas sa   asdasd232 sd".RemoveWhitespaces());
0 голосов
/ 14 января 2020

RESULT.Replace ("", string.Empty);

0 голосов
/ 11 января 2020

Вы можете использовать .Trim (), чтобы создать новую строку без пробелов.

string x = "Hello World";
console.writeline(x.Trim());
//Output : "HelloWorld"

Вы можете проверить другие перегрузки строки. Здесь (): Метод String.Trim

...