ฉันจะแก้ไขสตริงได้อย่างไร


106

ฉันต้องการทำสิ่งต่อไปนี้ใน C # (มาจากพื้นหลัง Python):

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

ฉันจะแทนที่โทเค็นภายในสตริงด้วยค่าภายนอกได้อย่างไร

คำตอบ:



270

สิ่งนี้ถูกเพิ่มเมื่อ C # 6.0 (Visual Studio 2015+)

ตัวอย่าง:

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!"

นี่คือน้ำตาลวากยสัมพันธ์สำหรับ:

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

แหล่งข้อมูลเพิ่มเติม:

การแก้ไขสตริงสำหรับการสนทนา C # (v2)

ตัวอย่างภาษา C # 6.0


แพทช์สำหรับโมโน (ลงวันที่ 2009 ระยะทางของคุณอาจแตกต่างกันไป) tirania.org/blog/archive/2009/Dec-20.html
Jefferey Cave

1
สำหรับผู้ใช้โมโน: stackoverflow.com/questions/29208869/…
Jefferey Cave

คุณลักษณะนี้เป็นสิ่งที่สวยงาม โดยเฉพาะอย่างยิ่งกับ VS2015 และการสนับสนุนโปรแกรมแก้ไขเพื่อให้คุณสามารถเห็นสตริงที่ถูกแก้ไขและรับ intellisense ได้อย่างชัดเจน มันใช้งานได้กับวิธีการ! $("This feature is {GetDescription(FEATURE_AMAZING))}");
Patrick

14

คุณสามารถใช้string.Formatเพื่อวางค่าลงในสตริง:

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

อีกทางเลือกหนึ่งคือการใช้ตัวดำเนินการเชื่อมต่อ C #:

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

หากคุณกำลังทำการเรียงต่อกันจำนวนมากให้ใช้StringBuilderคลาสที่มีประสิทธิภาพมากกว่า:

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

หากคุณใช้ Visual Studio 2015 กับ C # 6.0 อยู่ให้ลองทำดังต่อไปนี้:

var strVar = "stack";

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

คุณลักษณะนั้นเรียกว่าการแก้ไขสตริง


6

ไม่มีตัวดำเนินการสำหรับสิ่งนั้น string.Formatคุณจำเป็นต้องใช้

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

น่าเสียดายที่string.Formatเป็นวิธีการคงที่ดังนั้นคุณจึงไม่สามารถเขียน"This is {0}soverflow".Format(strVar)ได้ บางคนได้กำหนดวิธีการขยายซึ่งอนุญาตให้ใช้ไวยากรณ์นี้




1

คุณมี 2 ตัวเลือก คุณสามารถใช้ String.Format หรือใช้ตัวดำเนินการเรียงต่อกันก็ได้

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

หรือ

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

ภายใต้ฝาครอบString.Format()ใช้ StringBuilder โดยทั่วไปแล้ว StringBuilder จะมีประสิทธิภาพมากกว่าเมื่อเชื่อมสตริงจำนวนมากเข้าด้วยกัน แต่ตัวดำเนินการเรียงต่อกันนั้นสมบูรณ์แบบสำหรับการปิดหนึ่งครั้ง String.Format()มีประโยชน์เมื่อต้องใช้การจัดรูปแบบกับเอาต์พุตเช่นเพิ่มช่องว่างภายในหรือเลขศูนย์นำหน้าให้เป็นค่าตัวเลข ดังนั้นการใช้String.Format()ในลูปอาจทำให้เกิดการอินสแตนซ์ของ StringBuilders ได้มาก ในสถานการณ์นั้นควรใช้ StringBuilder ตัวเดียวที่ประกาศนอกลูปและAppendFormat()ภายในลูป
David Clarke

1

มีอีกวิธีหนึ่งในการใช้ตัวยึดตำแหน่งด้วยสตริงแทนที่ช่วยได้อย่างแปลกประหลาดในบางสถานการณ์:

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

1

คุณสามารถใช้วิธีต่อไปนี้

การแก้ไขสตริง

อักขระพิเศษ $ ระบุสตริงลิเทอรัลเป็นสตริงที่ถูกแก้ไข เช่น

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

สตริงที่ถูกแก้ไขเป็นสตริงลิเทอรัลที่อาจมีนิพจน์ที่ถูกแก้ไข เมื่อสตริงที่แก้ไขถูกแก้ไขเป็นสตริงผลลัพธ์รายการที่มีนิพจน์ที่ถูกแก้ไขจะถูกแทนที่ด้วยการแสดงสตริงของผลลัพธ์นิพจน์

สตริงรูปแบบ

ใช้ String.Format หากคุณต้องการแทรกค่าของวัตถุตัวแปรหรือนิพจน์ลงในสตริงอื่นเช่น

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


0

คุณสามารถทำได้ด้วย Expansive: https://github.com/anderly/Expansive


C # มีกลไกการแก้ไขในตัว ไม่มีเหตุผลที่จะรวมไลบรารีสำหรับฟังก์ชันนี้
ชื่อที่แสดง

2
@Displayname ดูวันที่คำถาม C # ไม่ได้มีการแก้ไขสตริงในตัวเสมอไป มันถูกเพิ่มใน C # 6 ในปี 2016 ดังนั้นเหตุผลสำหรับคำตอบของฉันในปี 2014
61
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.