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

125

Я хочу разбить эту строку:

string line = "First Name ; string ; firstName";

в массив их обрезанных версий:

"First Name"
"string"
"firstName"

Как я могу сделать все это в одной строке? Следующее дает мне ошибку «не удается преобразовать тип void»:

List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim()); 
Эдвард Тангуай
источник
2
Ошибка возвращается, потому что ForEachработает с текущим экземпляром IEnumerableи возвращается void.
Majkel

Ответы:

292

Пытаться

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

FYI, метод Foreach принимает действие (принимает T и возвращает void) для параметра, а ваша лямбда возвращает строку как строку. Trim возвращает строку

Метод расширения Foreach предназначен для изменения состояния объектов в коллекции. Поскольку строки неизменяемы, это не повлияет

Надеюсь, это поможет; o)

Седрик

Седрик Руп
источник
3
Примечание: ForEachэто не метод расширения.
Guffa
Лучшее решение в Linq!
Sonhja
Что делать, если значений нет, возвращает ли он ноль?
Демодав
если строка равна нулю, вы получите исключение. если строка не содержит ';' у вас будет список с одной строкой, соответствующей строке триммида
Седрик Руп
22

ForEachМетод не возвращает ничего, так что вы не можете назначить , что для переменной.

SelectВместо этого используйте метод расширения:

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();
Guffa
источник
5

Потому что p.Trim () возвращает новую строку.

Вам необходимо использовать:

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();
Мэтт Брекон
источник
3

В качестве альтернативы попробуйте следующее:

string[] parts = Regex.Split(line, "\\s*;\\s*");
Лоуренс Филлипс
источник
Это отличная идея, однако я считаю, что в ней отсутствуют завершающие пробелы в конце строки, верно?
jrichview 01
3

Вот способ расширения ...

    public static string[] SplitAndTrim(this string text, char separator)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            return null;
        }

        return text.Split(separator).Select(t => t.Trim()).ToArray();
    }
судебный исполнитель
источник
2

попробуйте использовать Regex:

List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();
user2826608
источник
0

Split возвращает тип string []. Напишите метод расширения:

public static string[] SplitTrim(this string data, char arg)
{
    string[] ar = data.Split(arg);
    for (int i = 0; i < ar.Length; i++)
    {
        ar[i] = ar[i].Trim();
    }
    return ar;
}

Мне понравилось ваше решение, поэтому я решил добавить к нему и сделать его более удобным.

public static string[] SplitAndTrim(this string data, char[] arg)
{
    return SplitAndTrim(data, arg, StringSplitOptions.None);
}

public static string[] SplitAndTrim(this string data, char[] arg, 
StringSplitOptions sso)
{
    string[] ar = data.Split(arg, sso);
    for (int i = 0; i < ar.Length; i++)
        ar[i] = ar[i].Trim();
    return ar;
}
foxjazzHack
источник
-1

Использовать регулярное выражение

string a="bob, jon,man; francis;luke; lee bob";
			String pattern = @"[,;\s]";
            String[] elements = Regex.Split(a, pattern).Where(item=>!String.IsNullOrEmpty(item)).Select(item=>item.Trim()).ToArray();;			
            foreach (string item in elements){
                Console.WriteLine(item.Trim());

Результат:

боб

джон

человек

Франциск

Люк

подветренный

боб

Объясните шаблон [,; \ s]: соответствует одному вхождению либо,; или пробел

Hung Vu
источник