สตริงเข้าร่วมรายการ <int> หรือประเภทอื่น ๆ


86

ฉันต้องการเปลี่ยนอาร์เรย์หรือรายการของ int เป็นสตริงคั่นด้วยจุลภาคดังนี้:

string myFunction(List<int> a) {
    return string.Join(",", a);
}

แต่สตริงเข้าร่วมใช้List<string>เป็นพารามิเตอร์ที่สองเท่านั้น วิธีที่ดีที่สุดในการทำคืออะไร?


2
คุณใช้ C # / .NET เวอร์ชันใด
Mark Byers

เป็นไปได้ที่จะซ้ำกันของstackoverflow.com/questions/3211422/…
goodeye

คำตอบ:


149

วิธีที่ดีที่สุดคืออัปเกรดเป็น. NET 4.0 ซึ่งมีการโอเวอร์โหลดที่ทำสิ่งที่คุณต้องการ:

หากคุณไม่สามารถอัพเกรดได้คุณสามารถบรรลุเอฟเฟกต์เดียวกันโดยใช้ Select และ ToArray

    return string.Join(",", a.Select(x => x.ToString()).ToArray());

ยังถือว่าเขาอยู่ใน C # 3, .NET 3.5 เป็นอย่างน้อย
Anthony Pegram

ทำไมต้องใช้ LINQ แทนToArrayวิธีการในตัวของList<T>?
Steven Sudit

2
เพราะเขาจะมี List <int> linq select จะแปลง List <int> เป็น IEnumerable <string> จากนั้นเป็นอาร์เรย์
Greg Bogumil

การอัปเกรดเป็น 4.0 นั้นใช้ไม่ได้จริงในสถานการณ์ของฉัน แต่โซลูชัน LINQ คือสิ่งที่ฉันกำลังมองหา ขอบคุณ!
Code Commander

1
@gbogumil: ขออภัยไม่ได้สังเกตว่าเป็นintไฟล์.
Steven Sudit

5

การใช้งานการรวมสตริงที่แจกแจงได้อย่างปลอดภัยและปรับขนาดได้สำหรับ. 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));

สนุก!


+1: นี่เป็นวิธีที่ฉันชอบก่อน. NET 4.0 สามารถปรับขนาดได้มากกว่าการสร้างอาร์เรย์ของสตริงใหม่ทั้งหมดจากรายการ ints เพื่อให้String.Join(String, String[])สามารถเรียกใช้ได้ สิ่งเดียวที่ฉันจะบอกก็คือมันผิดปกติที่จะเห็นวิธีนี้เขียนเป็นส่วนขยายในStringทางตรงกันข้ามIEnumerable<String>- ฉันมักจะเรียกมันในตอนท้ายของการเรียกวิธีการขยายโซ่ยาว
Alex Humphrey

2
ฉันขโมยไอเดียจาก Python ถ้านั่นช่วยได้!
ลบ

4

.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();
}

3
แนวทาง 2.0 ที่ดี คุณอาจต้องการกำหนดให้อักขระการรวมเป็นพารามิเตอร์แทนที่จะเข้ารหัสลงในเมธอด
Anthony Pegram

การเพิ่มประสิทธิภาพโดยทั่วไปคือการต่อท้ายตัวคั่นโดยไม่ต้องทดสอบจากนั้นลบอักขระสุดท้ายเมื่อคุณออกจากลูป
Steven Sudit

@Steven - ฉันกำลังคิดอยู่ แต่ฉันคิดว่าสิ่งนี้จะขึ้นอยู่กับความยาวของสตริงด้วย (โดยไม่ต้องทดสอบฉันไม่แน่ใจ) ดังนั้นฉันจึงติดอยู่กับการตรวจสอบบูลอย่างง่าย
Kyle Rosendo

ฉันสงสัยว่าการเพิ่มประสิทธิภาพจะวัดได้สำหรับสตริงที่ยาวเท่านั้น ต้องบอกว่าฉันไม่คิดว่ามันจะช้าลงสำหรับคนเตี้ย ๆ
Steven Sudit

3

มีวิธีการขยายที่คล้ายกันซึ่งฉันแก้ไขสิ่งนี้

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วิธีการอยู่แล้วและวิธีการใหม่นี้ดำเนินการที่แตกต่างไปจากเดิมอย่างสิ้นเชิงทำให้การใช้งานง่ายขึ้น ประการที่สองหากคุณกำลังจะสร้างวิธีนี้ให้ดำเนินการต่อไปและทำให้ใช้ได้โดยทั่วไป
Anthony Pegram

เป็นการแฮ็กที่เลียนแบบวิธีการเข้าร่วมกับอาร์เรย์ใน Ruby ruby-doc.org/core/classes/Array.html#M002182
Jonas Elfström

นอกจากนี้. ToString () ไม่ได้ส่งคืนการแสดงสตริงของ T เสมอไปดังนั้นฉันคิดว่านั่นอาจทำให้เกิดความสับสนได้
Jonas Elfström

2

คำตอบนี้เหมาะสำหรับคุณหากคุณยังไม่ต้องการเข้าไปเจาะลึก. 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);
}

3
นี่เป็นแนวทางที่ดีหากใครบางคนยังใช้ 2.0 อย่างไรก็ตามintArrayไม่จำเป็น List<int>สามารถจัดทำดัชนีได้และมีCountคุณสมบัติทำให้การแปลงเป็นอาร์เรย์ไม่จำเป็น คุณอาจต้องการทำให้อักขระการรวมเป็นพารามิเตอร์แทนที่จะเข้ารหัสลงในเมธอด
Anthony Pegram

2

การใช้. NET 4.0

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);
    }
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.