Подтвердить что ты не робот

Выполните Trim() при использовании Split()

Сегодня мне было интересно, есть ли лучшее решение для выполнения следующего примера кода.

string keyword = " abc, foo  ,     bar";
string match = "foo";
string[] split= keyword.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach(string s in split)
{
  if(s.Trim() == match){// asjdklasd; break;}
}

Есть ли способ выполнить trim() без ручного повторения каждого элемента? Я ищу что-то вроде "раскол по следующим символам и автоматически обрезаю каждый результат".

Ах, сразу перед публикацией я нашел

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

in Как можно разделить и обрезать строку на части в одной строке?

Тем не менее мне любопытно: может быть, есть лучшее решение? (Или компилятор, возможно, преобразует их в тот же вывод кода, что и Linq-Operation?)

4b9b3361

Ответ 1

Еще один возможный вариант (который избегает LINQ, к лучшему или худшему):

string line = " abc, foo  ,     bar";
string[] parts= Array.ConvertAll(line.Split(','), p => p.Trim());

Однако, если вам просто нужно знать, есть ли там - возможно, короткое замыкание?

bool contains = line.Split(',').Any(p => p.Trim() == match);

Ответ 2

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

Ответ 3

Попробуйте следующее:

string keyword = " abc, foo  ,     bar";
string match = "foo";
string[] split = Regex.Split(keyword.Trim(), @"\s*[,;]\s*");
if (split.Contains(match))
{
    // do stuff
}

Ответ 4

Если пробелы просто окружают слова в разделительной запятой, это будет работать:

var keyword = " abc, foo  ,     bar";
var array = keyword.Replace(" ", "").Split(',');
if (array.Contains("foo"))
{
    Debug.Print("Match");
}

Ответ 5

Вы найдете много разных способов сделать это, и изменение производительности и точность не будут очевидны. Я бы рекомендовал подключить их все к набору тестов, например NUnit, чтобы найти, какой из них выходит сверху и какие из них точны.

Используйте небольшие, средние и большие количества текста в циклах для изучения различных ситуаций.

Ответ 6

var parts = line.Split(';').Select(p => p.Trim()).Where(p => !string.IsNullOrWhiteSpace(p)).ToArray();