Як я можу розділити і розрізати рядок на частини всі по одній лінії?


124

Я хочу розділити цей рядок:

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.
Майкель

Відповіді:


291

Спробуйте

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

FYI, метод Foreach здійснює дію (приймає T і повертає недійсність) для параметра, і ваша лямбда повертає рядок як string.Trim повертає рядок

Метод розширення Foreach призначений для зміни стану об'єктів у колекції. Оскільки рядки незмінні, це не матиме ефекту

Сподіваюся, це допомагає; o)

Седрик


3
Примітка: ForEachне є методом розширення.
Гуффа

Найкраще рішення в Linq!
Sonhja

Що робити, якщо немає значень, воно повертається до нуля?
Демодав

якщо рядок є нульовим, ви отримуєте виняток. якщо рядок не містить ';' у вас буде список з однією струною, що відповідає обрізній лінії
Седрик Руп

22

The ForEachМетод не повертає нічого, так що ви не можете призначити , що для змінної.

SelectЗамість цього скористайтеся методом розширення:

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

5

Оскільки p.Trim () повертає новий рядок.

Вам потрібно використовувати:

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

3

Або спробуйте це:

string[] parts = Regex.Split(line, "\\s*;\\s*");

Це відмінна ідея, проте я вважаю, що пропускає будь-які проміжки в кінці рядка, правильно?
jrichview

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();
    }


0

Розбиття повертає рядок []. Написати метод розширення:

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;
}

-1

Використовуйте Regex

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());

Результат:

боб

jon

людина

Францис

лука

лий

боб

Поясніть шаблон [,; \ s]: Зрівняйте одне виникнення або,,; або космічний символ

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.