2012-02-19 37 views
91

Tôi muốn làm như sau trong C# (đến từ một nền Python):Làm cách nào để nội suy chuỗi?

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

Làm thế nào để thay thế các dấu hiệu bên trong chuỗi với giá trị bên ngoài của nó?

Trả lời

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

Và bạn cũng có thể sử dụng named parameters thay vì chỉ mục.

5

Không có toán tử nào 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.Format là một phương pháp tĩnh, vì vậy bạn có thể không chỉ đơn giản là viết "This is {0}soverflow".Format(strVar). Một số người đã định nghĩa một phương thức mở rộng, cho phép cú pháp này.

4

Sử dụng string.Format:

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

Sử dụng:

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

Bạn có 2 tùy chọn. Bạn có thể sử dụng String.Format hoặc bạn có thể sử dụng toán tử ghép nối.

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

HOẶC

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

Dưới sự bao trùm '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 tắt. 'String.Format()' rất hữu ích khi định dạng cần được áp dụng cho đầu ra, ví dụ: để thêm đệm hoặc số 0 đầu vào các giá trị số. Vì vậy, việc 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 StringBuilder. Trong tình huống đó, tốt hơn là sử dụng một StringBuilder đơn được khai báo bên ngoài vòng lặp và 'AppendFormat()' bên trong vòng lặp. –

13

Bạn có thể sử dụng string.Format giảm giá trị thành 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ử C# nối:

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

Nếu bạn đang làm rất nhiều concatenations sử dụng lớp StringBuilder đó là 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(); 
236

này đã được thêm vào như của C# 6.0 (Visual Studio 2015+).

Ví 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à cú pháp đường cho:

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

Tài nguyên bổ sung:

String Interpolation for C# (v2) Discussion

C# 6.0 Language Preview

+0

Bản vá cho đơn âm (ngày năm 2009, số dặm của bạn có thể thay đổi) http://tirania.org/blog/archive/2009/Dec-20.html –

+1

Đối với người dùng đơn sắc: http://stackoverflow.com/questions/29208869/c-sharp-6-0-string-interpolation-in-mono-mcs –

+0

Tính năng này thật là đẹp. Đặc biệt là với VS2015 và trình soạn thảo hỗ trợ, do đó bạn có thể thấy rõ ràng các chuỗi nội suy và nhận được intellisense. Nó thậm chí hoạt động với các phương pháp! '$ (" Tính năng này là {GetDescription (FEATURE_AMAZING))} ");' – Patrick

6

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

var strVar = "stack"; 

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

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

+4

Không phải chỉ là 'string str = $" Đây là {strVar} OverFlow ";'? –

+0

Đây không phải là mã biên dịch kể từ khi đưa ra 'CS1009 \t Chuỗi thoát không được nhận dạng ' – guneysus

+0

điều này bắt đầu từ C# 6.0 nly @guneysus –

0

Có một cách nữa để thực hiện giữ chỗ với string.Replace, kỳ quặc giúp trong những tình huống nhất định:

mystr = mystr.Replace("%soverflow", strVar); 
Các vấn đề liên quan