Làm cách nào để nội suy các chuỗi?


106

Tôi muốn làm như sau trong C # (đến từ nền tảng Python):

strVar = "stack"
mystr  = "This is %soverflow" % (strVar)

Làm cách nào để thay thế mã thông báo bên trong chuỗi bằng giá trị bên ngoài của nó?

Câu trả lời:



270

Điều này đã được thêm vào từ C # 6.0 (Visual Studio 2015+).

Thí dụ:

var planetName = "Bob";
var myName = "Ford"; 
var formattedStr = $"Hello planet {planetName}, my name is {myName}!";
// formattedStr should be "Hello planet Bob, my name is Ford!"

Đây là đường cú pháp cho:

var formattedStr = String.Format("Hello planet {0}, my name is {1}!", planetName, myName);

Tài nguyên bổ sung:

Nội suy chuỗi cho thảo luận C # (v2)

Xem trước ngôn ngữ C # 6.0


Vá cho mono (ngày năm 2009, mileage của bạn có thể thay đổi) tirania.org/blog/archive/2009/Dec-20.html
Jefferey Cave

1
Đối với những người sử dụng mono: stackoverflow.com/questions/29208869/...
Jefferey Cave

Tính năng này là một điều tuyệt vời. Đặc biệt với VS2015 và hỗ trợ trình chỉnh sửa để bạn có thể nhìn thấy rõ ràng các chuỗi được nội suy và nhận được intellisense. Nó thậm chí hoạt động với các phương pháp! $("This feature is {GetDescription(FEATURE_AMAZING))}");
Patrick

14

Bạn có thể sử dụng string.Formatđể thả các giá trị vào chuỗi:

private static readonly string formatString = "This is {0}overflow";
...
var strVar = "stack";
var myStr = string.Format(formatString, "stack");

Một cách khác là sử dụng toán tử nối C #:

var strVar = "stack";
var myStr = "This is " + strVar + "overflow";

Nếu bạn đang thực hiện nhiều phép nối, hãy sử dụng StringBuilderlớp hiệu quả hơn:

var strVar = "stack";
var stringBuilder = new StringBuilder("This is ");
for (;;)
{
    stringBuilder.Append(strVar); // spot the deliberate mistake ;-)
}
stringBuilder.Append("overflow");
var myStr = stringBuilder.ToString();


12

Nếu bạn hiện đang sử dụng Visual Studio 2015 với C # 6.0, hãy thử các cách sau:

var strVar = "stack";

string str = $"This is {strVar} OverFlow";

tính năng đó được gọi là nội suy chuỗi.


6

Không có nhà điều hành cho điều đó. Bạn cần sử dụng string.Format.

string strVar = "stack";
string mystr  = string.Format("This is {0}soverflow", strVar);

Thật không may string.Formatlà một phương thức tĩnh, vì vậy bạn không thể viết đơn giản "This is {0}soverflow".Format(strVar). Một số người đã xác định một phương thức mở rộng, cho phép cú pháp này.


5

Sử dụng string.Format:

string mystr = string.Format("This is {0}overflow", "stack");


1

Bạn có 2 lựa chọn. Bạn có thể sử dụng String.Format hoặc bạn có thể sử dụng toán tử nối.

String newString = String.Format("I inserted this string {0} into this one", oldstring);

HOẶC LÀ

String newString = "I inserted this string " + oldstring + " into this one";

Dưới vỏ bọc String.Format()sử dụng StringBuilder. StringBuilder thường hiệu quả hơn khi nối nhiều chuỗi nhưng toán tử nối là hoàn hảo cho một lần. String.Format()hữu ích khi định dạng cần được áp dụng cho đầu ra, ví dụ như thêm phần đệm hoặc số không ở đầu vào các giá trị số. Vì vậy, sử dụng String.Format()trong một vòng lặp sẽ có khả năng khởi tạo rất nhiều StringBuilders. Trong tình huống đó, tốt hơn là sử dụng một StringBuilder được khai báo bên ngoài vòng lặp và AppendFormat()bên trong vòng lặp.
David Clarke

1

Có một cách nữa để triển khai trình giữ chỗ bằng string.Replace, giúp ích một cách kỳ lạ trong một số trường hợp nhất định:

mystr = mystr.Replace("%soverflow", strVar);

1

Bạn có thể sử dụng cách sau

Nội suy chuỗi

Ký tự đặc biệt $ xác định một chuỗi ký tự là một chuỗi nội suy. ví dụ

string name = "Mark";
string surname = "D'souza";
WriteLine($"Name :{name} Surname :{surname}" );//Name :Mark Surname :D'souza  

Chuỗi nội suy là một chuỗi ký tự có thể chứa các biểu thức nội suy. Khi một chuỗi nội suy được phân giải thành một chuỗi kết quả, các mục có biểu thức nội suy được thay thế bằng các biểu diễn chuỗi của kết quả biểu thức.

String.Format

Sử dụng String.Format nếu bạn cần chèn giá trị của một đối tượng, biến hoặc biểu thức vào một chuỗi khác.

WriteLine(String.Format("Name: {0}, Surname : {1}", name, surname));


0

Bạn có thể thực hiện điều này với Expansive: https://github.com/anderly/Expansive


C # có một cơ chế nội suy được xây dựng sẵn. Hoàn toàn không có lý do gì để bao gồm một thư viện cho chức năng này.
Tên hiển thị

2
@Displayname xem ngày trên câu hỏi. C # không phải lúc nào cũng có nội suy chuỗi tích hợp. Nó đã được bổ sung trong C # 6 trong năm 2016. Do đó, lý do cho câu trả lời của tôi trong năm 2014.
anderly
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.