ฉันต้องการเปลี่ยนอาร์เรย์หรือรายการของ int เป็นสตริงคั่นด้วยจุลภาคดังนี้:
string myFunction(List<int> a) {
return string.Join(",", a);
}
แต่สตริงเข้าร่วมใช้List<string>
เป็นพารามิเตอร์ที่สองเท่านั้น วิธีที่ดีที่สุดในการทำคืออะไร?
ฉันต้องการเปลี่ยนอาร์เรย์หรือรายการของ int เป็นสตริงคั่นด้วยจุลภาคดังนี้:
string myFunction(List<int> a) {
return string.Join(",", a);
}
แต่สตริงเข้าร่วมใช้List<string>
เป็นพารามิเตอร์ที่สองเท่านั้น วิธีที่ดีที่สุดในการทำคืออะไร?
คำตอบ:
วิธีที่ดีที่สุดคืออัปเกรดเป็น. NET 4.0 ซึ่งมีการโอเวอร์โหลดที่ทำสิ่งที่คุณต้องการ:
หากคุณไม่สามารถอัพเกรดได้คุณสามารถบรรลุเอฟเฟกต์เดียวกันโดยใช้ Select และ ToArray
return string.Join(",", a.Select(x => x.ToString()).ToArray());
ToArray
วิธีการในตัวของList<T>
?
int
ไฟล์.
การใช้งานการรวมสตริงที่แจกแจงได้อย่างปลอดภัยและปรับขนาดได้สำหรับ. NET 3.5 การใช้ตัววนซ้ำเพื่อให้ค่าสตริงการรวมไม่ติดอยู่ที่ส่วนท้ายของสตริง ทำงานได้อย่างถูกต้องกับ 0, 1 และองค์ประกอบอื่น ๆ :
public static class StringExtensions
{
public static string Join<T>(this string joinWith, IEnumerable<T> list)
{
if (list == null)
throw new ArgumentNullException("list");
if (joinWith == null)
throw new ArgumentNullException("joinWith");
var stringBuilder = new StringBuilder();
var enumerator = list.GetEnumerator();
if (!enumerator.MoveNext())
return string.Empty;
while (true)
{
stringBuilder.Append(enumerator.Current);
if (!enumerator.MoveNext())
break;
stringBuilder.Append(joinWith);
}
return stringBuilder.ToString();
}
}
การใช้งาน:
var arrayOfInts = new[] { 1, 2, 3, 4 };
Console.WriteLine(",".Join(arrayOfInts));
var listOfInts = new List<int> { 1, 2, 3, 4 };
Console.WriteLine(",".Join(listOfInts));
สนุก!
String.Join(String, String[])
สามารถเรียกใช้ได้ สิ่งเดียวที่ฉันจะบอกก็คือมันผิดปกติที่จะเห็นวิธีนี้เขียนเป็นส่วนขยายในString
ทางตรงกันข้ามIEnumerable<String>
- ฉันมักจะเรียกมันในตอนท้ายของการเรียกวิธีการขยายโซ่ยาว
.NET 2.0:
static string IntListToDelimitedString(List<int> intList, char Delimiter)
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < intList.Count; i++)
{
builder.Append(intList[i].ToString());
if (i != intList.Count - 1)
builder.Append(Delimiter);
}
return builder.ToString();
}
มีวิธีการขยายที่คล้ายกันซึ่งฉันแก้ไขสิ่งนี้
public static class MyExtensions
{
public static string Join(this List<int> a, string splitChar)
{
return string.Join(splitChar, a.Select(n => n.ToString()).ToArray());
}
}
และคุณใช้มันแบบนี้
var test = new List<int>() { 1, 2, 3, 4, 5 };
string s = test.Join(",");
.NET 3.5
IEnumerable<T>
มีJoin
วิธีการอยู่แล้วและวิธีการใหม่นี้ดำเนินการที่แตกต่างไปจากเดิมอย่างสิ้นเชิงทำให้การใช้งานง่ายขึ้น ประการที่สองหากคุณกำลังจะสร้างวิธีนี้ให้ดำเนินการต่อไปและทำให้ใช้ได้โดยทั่วไป
คำตอบนี้เหมาะสำหรับคุณหากคุณยังไม่ต้องการเข้าไปเจาะลึก. NET 4.0
String.Join () เชื่อมต่อองค์ประกอบทั้งหมดของอาร์เรย์สตริงโดยใช้ตัวคั่นที่ระบุระหว่างแต่ละองค์ประกอบ
ไวยากรณ์คือ
public static string Join(
string separator,
params string[] value
)
แทนที่จะส่งรายการ int ของคุณไปยังวิธีการเข้าร่วมฉันขอแนะนำให้สร้างอาร์เรย์ของสตริงก่อน
นี่คือสิ่งที่ฉันเสนอ:
static string myFunction(List<int> a) {
int[] intArray = a.ToArray();
string[] stringArray = new string[intArray.Length];
for (int i = 0; i < intArray.Length; i++)
{
stringArray[i] = intArray[i].ToString();
}
return string.Join(",", stringArray);
}
intArray
ไม่จำเป็น List<int>
สามารถจัดทำดัชนีได้และมีCount
คุณสมบัติทำให้การแปลงเป็นอาร์เรย์ไม่จำเป็น คุณอาจต้องการทำให้อักขระการรวมเป็นพารามิเตอร์แทนที่จะเข้ารหัสลงในเมธอด
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string s = myFunction(PopulateTestList());
this.TextBox1.Text = s;
}
protected List<int> PopulateTestList()
{
List<int> thisList = new List<int>();
thisList.Add(22);
thisList.Add(33);
thisList.Add(44);
return thisList;
}
protected string myFunction(List<int> a)
{
return string.Join(",", a);
}
}
ใน. NET คลาสรายการมี.ToArray()
วิธีการ สิ่งนี้สามารถใช้ได้:
string myFunction(List<int> a)
{
return string.Join(",", a.ToArray());
}
อ้างถึงรายการ <T> วิธีการ (MSDN)