ฉันจะแยกและตัดแต่งสตริงออกเป็นส่วน ๆ ในบรรทัดเดียวได้อย่างไร


125

ฉันต้องการแยกบรรทัดนี้:

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

ลงในอาร์เรย์ของเวอร์ชันที่ถูกตัดแต่ง:

"First Name"
"string"
"firstName"

ฉันจะทำทั้งหมดนี้ในบรรทัดเดียวได้อย่างไร ต่อไปนี้ทำให้เกิดข้อผิดพลาด "ไม่สามารถแปลงประเภทเป็นโมฆะ":

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 ใช้ Action (ใช้ T และคืนค่าเป็นโมฆะ) สำหรับพารามิเตอร์และ lambda ของคุณส่งคืนสตริงเป็นสตริงตัดกลับสตริง

วิธีการขยาย Foreach มีไว้เพื่อแก้ไขสถานะของวัตถุภายในคอลเลกชัน เนื่องจากสตริงไม่เปลี่ยนรูปจึงไม่มีผลใด ๆ

หวังว่ามันจะช่วย; o)

Cédric


3
หมายเหตุ: ForEachไม่ใช่วิธีการขยาย
Guffa

ทางออกที่ดีที่สุดใน Linq!
Sonhja

จะเกิดอะไรขึ้นถ้าไม่มีค่ามันจะคืนค่า null?
Demodave

ถ้าบรรทัดเป็นโมฆะคุณจะได้รับข้อยกเว้น ถ้าบรรทัดไม่มี ';' คุณจะมีรายการที่มีหนึ่งสตริงที่ตรงกับเส้น trimmid
Cédric Rup

22

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



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

ผลลัพธ์:

ผมบ๊อบ

จอน

ชาย

ฟรานซิส

ลุค

ที่กำบัง

ผมบ๊อบ

อธิบายรูปแบบ [,; \ s]: จับคู่หนึ่งครั้งของทั้ง; หรืออักขระเว้นวรรค

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.