Làm cách nào để chia và cắt một chuỗi thành các phần trên một dòng?


124

Tôi muốn chia dòng này:

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

vào một loạt các phiên bản được cắt bớt của chúng:

"First Name"
"string"
"firstName"

Làm thế nào tôi có thể làm điều này tất cả trên một dòng? Sau đây là lỗi "không thể chuyển đổi kiểu void":

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

2
Lỗi được trả về vì ForEachhoạt động trên phiên bản hiện tại của IEnumerablevà trả về void.
Majkel

Câu trả lời:


291

Thử

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

FYI, phương thức Foreach nhận một Hành động (lấy T và trả về void) cho tham số và lambda của bạn trả về một chuỗi dưới dạng chuỗi.Trim trả về một chuỗi

Phương thức mở rộng Foreach có nghĩa là để sửa đổi trạng thái của các đối tượng trong bộ sưu tập. Vì chuỗi là bất biến, điều này sẽ không có tác dụng

Hy vọng nó sẽ giúp; o)

Cédric


3
Lưu ý: ForEachkhông phải là một phương thức mở rộng.
Guffa

Giải pháp tốt nhất ở Linq!
Sonhja

Nếu không có giá trị nào thì nó trả về null?
Demodave

nếu dòng là null thì bạn sẽ có một ngoại lệ. nếu dòng không chứa ';' bạn sẽ có một danh sách với một chuỗi tương ứng với dòng trimmid
Cédric Rup

22

Các ForEachphương pháp không trả lại bất cứ điều gì, vì vậy bạn không thể gán đến một biến.

Sử dụng Selectphương pháp mở rộng thay thế:

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

5

Bởi vì p.Trim () trả về một chuỗi mới.

Bạn cần sử dụng:

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

3

Hoặc hãy thử điều này:

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

Đây là một ý tưởng tuyệt vời, tuy nhiên, tôi tin rằng nó bỏ sót bất kỳ khoảng trống nào ở cuối chuỗi, đúng không?
jrichview

3

Đây là một phương pháp mở rộng ...

    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

thử sử dụng Regex:

List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();

0

Split trả về kiểu chuỗi []. Viết một phương thức mở rộng:

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

Tôi thích giải pháp của bạn vì vậy tôi quyết định thêm vào nó và làm cho nó dễ sử dụng hơn.

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

Sử dụng 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());

Kết quả:

bob

jon

Đàn ông

francis

luke

lee

bob

Giải thích mẫu [,; \ s]: Khớp một lần xuất hiện của dấu,; hoặc ký tự khoảng trắng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.