Выполните 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?)
Ответы
Ответ 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();