บรรทัดการแก้ไขสตริงแบบยาวใน C # 6


138

ฉันพบว่าแม้ว่าการแก้ไขสตริงจะดีมากเมื่อใช้กับการเรียกรูปแบบสตริงของฐานรหัสที่มีอยู่ของฉันเนื่องจากขีด จำกัด คอลัมน์ที่ต้องการโดยทั่วไปสตริงจะยาวเกินไปสำหรับบรรทัดเดียวอย่างรวดเร็ว โดยเฉพาะอย่างยิ่งเมื่อนิพจน์ที่ถูกแก้ไขมีความซับซ้อน ด้วยสตริงรูปแบบคุณมีรายการตัวแปรที่คุณสามารถแบ่งออกเป็นหลายบรรทัด

var str = string.Format("some text {0} more text {1}",
    obj1.property,
    obj2.property);

ใครมีวิธีที่ต้องการในการทำลายเส้นเหล่านี้หรือไม่?

ฉันคิดว่าคุณสามารถทำสิ่งต่างๆเช่น:

var str = $"some text { obj1.property }" +
  " more text { obj2.property };

1
จากประสบการณ์ของฉันควรหลีกเลี่ยงการแก้ไขนิพจน์ที่ซับซ้อน ค่อนข้างแยกตัวแปรในกรณีนั้น หากคุณทำเช่นนั้นและคุณแยกส่วนที่คุณมีการขึ้นบรรทัดใหม่ภายในสตริงของคุณโดยทั่วไปจะเข้ากันได้ดี
markijbema

2
ฉันสับสนกับคำถามนี้ ฉันแค่ต้องการมัลติไลน์$""ที่ใช้งานได้@""
Colonel Panic

2
ผู้พัน Panic คำถามคือถามเกี่ยวกับวิธีการแบ่งบรรทัดการแก้ไขที่ยาวเพื่อที่เราจะได้ไม่ละเมิดข้อกำหนดความกว้างของคอลัมน์โดยไม่ต้องแนะนำ linefeeds ในตัวอักษรสตริง $ @ "" นั้นยอดเยี่ยมมาก แต่มีการขึ้นบรรทัดใหม่ใด ๆ ที่จะอยู่ในสตริงลิเทอรัล
Jeremiah Gowdy

4
อันตราย: $"some text { obj1.property }" + " more text { obj2.property }";อย่าทำในสิ่งที่คุณคิดว่ามันทำ เฉพาะครึ่งแรกของนิพจน์นั้นเท่านั้นที่เป็นสตริงที่ถูกแก้ไข มันจะถูกตัดแบ่งแล้วด้วยไม่ใช่ -interpolated สตริงตัวอักษร" more text { obj2.property }"
Bacar

1
เพื่อสนับสนุน \ t \ r \ n ใน $ @ ดูคำถามstackoverflow.com/questions/51991713/…
M. Hassan

คำตอบ:


203

คุณสามารถแบ่งบรรทัดออกเป็นหลายบรรทัด แต่ฉันจะไม่บอกว่าไวยากรณ์ดูดีอีกต่อไป

คุณต้องใช้$@ไวยากรณ์เพื่อใช้สตริงคำต่อคำแบบสอดแทรกและคุณสามารถวางบรรทัดใหม่ภายใน{...}พารามิเตอร์ได้ดังนี้:

string s = $@"This is all {
    10
    } going to be one long {
    DateTime.Now
    } line.";

สตริงด้านบนจะไม่มีการขึ้นบรรทัดใหม่และจะมีเนื้อหาดังนี้:

นี่คือทั้งหมด 10 จะเท่ากับ 1 ยาว 01.08.2015 23.49.47 บรรทัด

(หมายเหตุรูปแบบภาษานอร์เวย์)

string.Formatตอนนี้ต้องบอกว่าฉันจะไม่หยุดการใช้ ในความคิดของฉันนิพจน์การแก้ไขสตริงเหล่านี้บางส่วนดูดีจริงๆ แต่นิพจน์ที่ซับซ้อนกว่านั้นเริ่มอ่านยากมาก เมื่อพิจารณาว่าหากคุณไม่ใช้FormattableStringรหัสจะถูกรวบรวมเป็นการเรียกร้องString.Formatต่อไปฉันจะบอกว่าให้ดำเนินการต่อไปในString.Formatที่ที่เหมาะสม


คำตอบที่มั่นคง ฉันค่อนข้างมั่นใจว่าFormattableStringจะต้องโทรไปหาString.Formatเช่นกัน
Alex Booker

8
คำตอบนี้ช่วยให้ฉันหาวิธีตรงข้ามกับสิ่งนี้ ขอบคุณสำหรับ$@""ไวยากรณ์!
Bobson

1
@AlexBooker มันซับซ้อนกว่านั้น คุณไม่สามารถทำได้FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");เนื่องจากจะรวมสตริงที่ถูกแก้ไขทั้งสองเป็นสตริงแบบง่ายเส้นเดียว
ANeves คิดว่า SE เป็นคนชั่ว

บรรทัดใหม่และแท็บได้รับการยอมรับในสตริงคำต่อคำที่มีการแก้ไข ป้อนสิ่งต่อไปนี้ลงในหน้าต่างโต้ตอบ C # และสตริงผลลัพธ์จะได้รับการจัดรูปแบบ: > var name = "Simon"; var templateName = "How to interpolate a verbatim string"; var now = DateTime.UtcNow;. var output = $@"Hi {name}, This template is a demo of {templateName}. It was ran at {now.ToString("o")}"; > output. ผลผลิตคือ"Hi Simon,\r\nThis template is a demo of How to interpolate a verbatim string.\r\n\r\nIt was ran at 2020-01-24T15:49:35.6678353Z"
Enzoaeneas

1
@ Enzoaeneas ฉันคิดว่าคุณพูดเกินจริงกับการสนับสนุนการจัดรูปแบบในความคิดเห็น แต่ฉันเข้าใจและเห็นด้วยกับสิ่งที่คุณพูด
Lasse V.Karlsen

63

คุณสามารถรวม$และ@เข้าด้วยกันเพื่อรับการแก้ไขสตริงและลิเทอรัลสตริงแบบหลายบรรทัด:

var str = $@"some text { obj1.property }
     more text { obj2.property }";

แต่นั่นจะทำให้คุณมีNewLineตัวละครในระหว่างนั้นดังนั้นจึงอาจไม่ใช่สิ่งที่คุณต้องการ


3
แต่ @ ไม่ใส่ฟีดบรรทัดลงในลิเทอรัลจริงหรือ?
Jeremiah Gowdy

5
มัน. อัปเดตคำตอบของฉันเพื่อพูดอย่างชัดเจนว่า
MarcinJuraszek

ไม่เพียงขึ้นบรรทัดใหม่ แต่ยังรวมถึงแท็บเริ่มต้นของบรรทัดใหม่ด้วย เพื่อให้แสดงรูปแบบสตริงจริงได้อย่างถูกต้องเมื่อใช้$@"ในวิชวลสตูดิโอคุณต้องเริ่มบรรทัดใหม่จากด้านซ้ายสุดของโปรแกรมแก้ไขข้อความ
GDS

ด้วยวิธีนี้คุณไม่สามารถใช้เช่น \ r และ \ n ในสตริงได้
Johan Franzén

24

ในขณะที่ OP ขออย่างอื่นฉันคาดว่าหลาย ๆ คนที่อ่านคำถามนี้จะต้องการการแก้ไขแบบหลายบรรทัด$""ที่ใช้งาน@""ได้ ในการทำเช่นนั้นให้ใช้$@""

$@"Height: {height}
Width: {width}
Background: {background}"

3
เขาไม่ต้องการให้มีการขึ้นบรรทัดใหม่ในผลลัพธ์เพียงแค่ใช้รหัสเพื่อตัดบรรทัดที่แตกต่างกัน
Martin Capodici

7
เขากล่าวชัดเจนว่าคำตอบนี้มีไว้สำหรับผู้ชมที่เข้ามาค้นหาวิธีสร้างสตริงหลายบรรทัดโดยใช้ไวยากรณ์การแก้ไขสตริง
Brandon Bonds

2

นี่ไง:

var str = $"some text { obj1.property }" +
          $" more text { obj2.property }";

สังเกตสิ่งที่สอง$ในไฟล์$"..." + $"..."


19
โปรดทราบว่าสิ่งนี้จะโทรไปยัง String สองครั้งฟอร์แมตและสร้างสตริงสามสายในหน่วยความจำ (Side A, Side B และ A + B)
Kevin Kalitowski

1
สิ่งนี้จะป้องกันไม่ให้คุณใช้การFormattableStringร่ายกับสตริงที่ต่อกันหรือไม่?
binki

4
ในการใช้งานจำนวนมากในปัจจุบันการทำงานบนซีพียู GHz พร้อมหน่วยความจำ Gb การโทรพิเศษและสตริงเพิ่มเติมจะไม่ทำให้คุณมีปัญหาด้านประสิทธิภาพ ปัญหาประสิทธิภาพจะเกิดจากเช่นการใช้อัลกอริทึมของ O (n2) ฉันคิดว่ามันไม่ยุติธรรมที่จะลดคะแนนผู้ชายคนนี้
Johan Franzén

1

ฉันใช้ StringBuilder ภายใน ToString () ที่ถูกแทนที่เป็นตัวอย่าง

    // return employee data
    public override string ToString()
    {
        StringBuilder buffer = new StringBuilder();
        buffer.AppendLine($"Number: {EmployeeNumber}");
        buffer.AppendLine($"Name: {EmployeeName}");
        buffer.AppendLine($"Address: {PostalAddress}");
        buffer.AppendLine($"Phone: {PhoneNumber}");
        buffer.AppendLine($"Age: {EmployeeAge}");
        buffer.AppendLine($"Gender: {EmployeeGender}");
        buffer.AppendLine($"Status: {EmployeeStatus}");
        buffer.AppendLine($"Manager: {EmployeeManager}");
        buffer.AppendLine($"Start: {EmployeeStartDate.ToShortDateString()}");
        return buffer.ToString();
    }

แล้วทำไมไม่buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);???
TS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.