Làm thế nào để chèn dòng mới trong chuỗi ký tự?


155

Trong .NET tôi có thể cung cấp cả hai \rhoặc \nchuỗi ký tự, nhưng có cách nào để chèn một ký tự đặc biệt như "dòng mới" như thuộc tính Environment.NewLinetĩnh không?


9
Câu hỏi là gì?
iburlakov

Câu trả lời:


319

Vâng, các tùy chọn đơn giản là:

  • string.Format:

    string x = string.Format("first line{0}second line", Environment.NewLine);
  • Nối chuỗi:

    string x = "first line" + Environment.NewLine + "second line";
  • Nội suy chuỗi (trong C # 6 trở lên):

    string x = $"first line{Environment.NewLine}second line";

Bạn cũng có thể sử dụng \ n ở mọi nơi và thay thế:

string x = "first line\nsecond line\nthird line".Replace("\n",
                                                         Environment.NewLine);

Lưu ý rằng bạn không thể đặt chuỗi này thành hằng số , vì giá trị của Environment.NewLinesẽ chỉ khả dụng tại thời điểm thực hiện.


1
Chà, cảm ơn tất nhiên nhưng tôi có nghĩa là tránh sử dụng Môi trường.NewLine, câu hỏi của tôi là nếu có '/ dòng mới' theo nghĩa đen.
Đội trưởng Comic

2
@Captain: Tại sao bạn muốn tránh Environment.NewLine? Hoàn toàn ngược lại, đó là một cách thực hành tốt để sử dụng nó
abatishchev

18
@abatishchev: Ở một số nơi, đó là cách thực hành tốt. Trong những người khác của tôi thì không. Bạn thực sự cần phải biết rằng bạn muốn sử dụng một nền tảng cụ thể. Ví dụ: không phải là ý tưởng hay nếu bạn đang sử dụng giao thức mạng sẽ tự xác định các đầu cuối dòng.
Jon Skeet

1
@Captain Comic: Câu cuối cùng của tôi giải thích lý do tại sao nó không thể là một lối thoát theo nghĩa đen - bạn không thể đưa nó vào siêu dữ liệu cho hằng chuỗi, bởi vì đó không phải là giá trị không đổi.
Jon Skeet

1
Vâng, có thể tôi đã miễn cưỡng vì cả hai tùy chọn: một sử dụng toán tử cộng và thứ hai sử dụng phương thức Format là một chi phí khá lớn trong đó việc tiêm chữ '\ newline' sẽ là cách nhanh nhất. Nhưng như Jon nói NewLine theo nghĩa đen nếu tồn tại sẽ phải phụ thuộc vào nền tảng và năng động.
Đội trưởng Comic

33

Nếu bạn muốn có một chuỗi const có chứa Môi trường.NewLine trong đó, bạn có thể làm một cái gì đó như thế này:

const string stringWithNewLine =
@"first line
second line
third line";

BIÊN TẬP

Vì đây là trong một chuỗi const nên nó được thực hiện trong thời gian biên dịch do đó nó là sự giải thích của người biên dịch về một dòng mới. Tôi dường như không thể tìm thấy một tài liệu tham khảo giải thích hành vi này, nhưng, tôi có thể chứng minh nó hoạt động như dự định. Tôi đã biên dịch mã này trên cả Windows và Ubuntu (với Mono) sau đó tháo rời và đây là kết quả:

Tháo rời trên Windows Tháo rời trên Ubuntu

Như bạn có thể thấy, trong dòng mới của Windows được hiểu là \ r \ n và trên Ubuntu là \ n


1
Trình biên dịch sẽ tự động thêm một môi trường.NewLine giữa mỗi dòng trong văn bản. Vì vậy, chuỗi được hiểu là: "dòng đầu tiên" + Môi trường.NewLine + "dòng thứ hai" + Môi trường.NewLine + "dòng thứ ba"
Tal Jerome

3
+1 Cách ít được biết đến khi chèn dòng mới trong chuỗi ký tự. Có bất kỳ tài liệu tham khảo cho hành vi bạn chỉ định? Có thực sự là Môi trường.NewLine hay là định nghĩa trình biên dịch của một dòng mới?
Nỗi sợ hãi của sự tuyệt vọng

1
Bạn có chắc chắn đó không phải là ký tự dòng mới của trình soạn thảo mã được chèn vào đó không? Nếu bạn sao chép-dán mã đó vào trình chỉnh sửa trên Windows, nó có thể sẽ được chuyển đổi thành \ r \ n. Thực hiện tương tự trên nền tảng giống Unix và thay vào đó, nó có thể sẽ được chuyển đổi thành \ n.
Xiyng

Xem ra với điều này. Nếu bạn kiểm tra mã trên máy chủ CI / CD (như Teamcity, kiểm tra phía máy chủ), nó sẽ thay đổi CRLF thành LF và sẽ không có dòng mới trong chuỗi.
Leszek P

13
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();

2
Tại sao bạn sẽ làm điều này thay vì sử dụng first + Environment.NewLine + secondcái nào hiệu quả hơn và (IMO) dễ đọc hơn?
Jon Skeet

@Jon: Hiệu quả hơn, thật sao? Tôi nghĩ rằng String.Formatsẽ tạo ra 1 chuỗi cùng một lúc (nhưng bên trong nó hơi chậm vì các cách nối cụ thể về văn hóa, v.v.), trong khi nối chuỗi - 1 kết quả + 1 tạm thời, phải không?
abatishchev

1
@abatishchev: trình biên dịch chuyển đổi str + str + str thành String.Concatenate, nó trực tiếp xây dựng chỉ một chuỗi đầu ra (IIRC, nếu các chuỗi là bằng chữ thì việc ghép được thực hiện trong trình biên dịch.
Richard

@Richard: tức là ghép nhiều chuỗi nhưng một dòng ( "a"+b+"c"+d, v.v.) bằng hiệu suất có bằng một đơn không? Hoặc chỉ cần chuyển đổi String.Concatenate(a,b,c,d,etc), phải không?
abatishchev

@abatishchev: Đó là lý do tại sao tôi không đề xuất string.Formattrong bình luận. Việc nối chuỗi sẽ không tạo ra bất kỳ chuỗi tạm thời nào, bởi vì trình biên dịch sẽ gọi string.Concat(first, Environment.NewLine, second).
Jon Skeet

3

Thêm một cách sắp xếp thuận tiện của Môi trường.NewLine trong chuỗi định dạng. Ý tưởng là tạo phương thức mở rộng chuỗi định dạng chuỗi như bình thường nhưng cũng thay thế {nl} trong văn bản bằng Môi trường.NewLine

Sử dụng

   " X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
   gives:
    X=1
    Y=2
    X+Y=3

    ///<summary>
    /// Use "string".FormatIt(...) instead of string.Format("string, ...)
    /// Use {nl} in text to insert Environment.NewLine 
    ///</summary>
    ///<exception cref="ArgumentNullException">If format is null</exception>
    [StringFormatMethod("format")]
    public static string FormatIt(this string format, params object[] args)
    {
        if (format == null) throw new ArgumentNullException("format");

        return string.Format(format.Replace("{nl}", Environment.NewLine), args);
    }

Ghi chú

  1. Nếu bạn muốn ReSharper làm nổi bật các tham số của mình, hãy thêm thuộc tính vào phương thức trên

    [StringFormatMethod ("định dạng")]

  2. Việc triển khai này rõ ràng là kém hiệu quả hơn so với String.Format

  3. Có lẽ một người, người quan tâm đến câu hỏi này cũng sẽ quan tâm đến câu hỏi tiếp theo: Định dạng chuỗi được đặt tên trong C #


2
string myText =
    @"<div class=""firstLine""></div>
      <div class=""secondLine""></div>
      <div class=""thirdLine""></div>";

không phải vậy đâu

string myText =
@"<div class=\"firstLine\"></div>
  <div class=\"secondLine\"></div>
  <div class=\"thirdLine\"></div>";

1
static class MyClass
{
   public const string NewLine="\n";
}

string x = "first line" + MyClass.NewLine + "second line"

3
-1: Hệ thống đã được xác định Environment.NewLine- xem các câu trả lời khác.
Richard

@Richard: OP, theo như tôi có thể hiểu anh ấy, muốn sử dụng chuỗi ký tự theo nghĩa đen, tức làconst string
abatishchev


1

các phiên bản .net mới hơn cho phép bạn sử dụng $ phía trước nghĩa đen cho phép bạn sử dụng các biến bên trong như sau:

var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";

1
Một chút bối cảnh sẽ không tệ.
croxy

1
Điều này không cung cấp một câu trả lời cho câu hỏi. Một khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào ; thay vào đó, cung cấp câu trả lời không yêu cầu làm rõ từ người hỏi . - Từ đánh giá
H. Pauwelyn

@ H.Pauwelyn: Thx cho phản hồi. Tôi đã thêm một chút bối cảnh. Từ quan điểm của tôi, giải pháp chắc chắn trả lời câu hỏi.
DanielK

0

Nếu bạn thực sự muốn chuỗi Dòng mới là một hằng số, thì bạn có thể làm điều này:

public readonly string myVar = Environment.NewLine;

Người dùng của từ khóa chỉ đọc trong C # có nghĩa là biến này chỉ có thể được gán cho một lần. Bạn có thể tìm thấy các tài liệu về nó ở đây . Nó cho phép khai báo một biến không đổi có giá trị không được biết cho đến thời gian thực hiện.


0

Tôi thích nhiều hơn "cách pythonic"

List<string> lines = new List<string> {
    "line1",
    "line2",
    String.Format("{0} - {1} | {2}", 
        someVar,
        othervar, 
        thirdVar
    )
};

if(foo)
    lines.Add("line3");

return String.Join(Environment.NewLine, lines);

0

Nếu bạn đang làm việc với ứng dụng Web, bạn có thể thử điều này.

StringBuilder sb = new StringBuilder();
sb.AppendLine("Some text with line one");
sb.AppendLine("Some mpre text with line two");
MyLabel.Text = sb.ToString().Replace(Environment.NewLine, "<br />")

0

Nếu tôi hiểu câu hỏi: Cặp đôi "\r\n"để có được dòng mới dưới đây trong một textbox. Ví dụ của tôi đã làm việc -

   string s1 = comboBox1.Text;     // s1 is the variable assigned to box 1, etc.
   string s2 = comboBox2.Text;

   string both = s1 + "\r\n" + s2;
   textBox1.Text = both;

Một câu trả lời điển hình có thể là s1 s2 trong kiểu text boxsử dụng được xác định.


-1

Ở đây, Môi trường.NewLine không hoạt động.

Tôi đặt một " < br / > " trong một chuỗi và làm việc.

Ví dụ:

ltrYourLiteral.Text = "Dòng đầu tiên <. br / > Second Line.";

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.