string.Join di List <int> atau tipe lainnya

86

Saya ingin mengubah array atau daftar int menjadi string yang dipisahkan koma, seperti ini:

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

Tapi string.Join hanya dibutuhkan List<string>sebagai parameter kedua. Apa cara terbaik untuk melakukannya?

Code Commander
sumber
2
Versi C # / .NET apa yang Anda gunakan?
Mark Byers
Kemungkinan duplikat stackoverflow.com/questions/3211422/…
selamat tinggal

Jawaban:

149

Cara terbaik adalah dengan meningkatkan ke .NET 4.0 di mana ada kelebihan beban yang melakukan apa yang Anda inginkan:

Jika Anda tidak dapat meningkatkan, Anda dapat memperoleh efek yang sama menggunakan Select dan ToArray.

    return string.Join(",", a.Select(x => x.ToString()).ToArray());
Mark Byers
sumber
Juga mengasumsikan dia setidaknya di C # 3, .NET 3.5
Anthony Pegram
Mengapa menggunakan LINQ daripada ToArraymetode bawaan List<T>?
Steven Sudit
2
karena dia akan memiliki List <int>. Linq pilih mengubah List <int> menjadi IEnumerable <string> dan kemudian menjadi array.
Greg Bogumil
Mengupgrade ke 4.0 tidak praktis dalam situasi saya, tetapi solusi LINQ persis seperti yang saya cari. Terima kasih!
Code Commander
1
@gbogumil: Maaf, tidak menyadarinya int.
Steven Sudit
5

Sebuah scalable dan aman pelaksanaan string enumerable generik bergabung untuk NET 3.5. Penggunaan iterator adalah agar nilai string gabungan tidak tertahan di akhir string. Ini bekerja dengan benar dengan 0, 1 dan lebih banyak elemen:

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

Pemakaian:

var arrayOfInts = new[] { 1, 2, 3, 4 };
Console.WriteLine(",".Join(arrayOfInts));

var listOfInts = new List<int> { 1, 2, 3, 4 };
Console.WriteLine(",".Join(listOfInts));

Nikmati!

Dihapus
sumber
+1: Ini adalah cara yang saya sukai sebelum .NET 4.0. Jauh lebih terukur daripada menghasilkan larik string yang sama sekali baru dari daftar int sehingga String.Join(String, String[])bisa dipanggil. Satu-satunya hal yang akan saya katakan adalah tidak biasa melihat metode ini ditulis sebagai ekstensi Stringsebagai lawan IEnumerable<String>- saya cenderung selalu menyebutnya di akhir rantai panjang panggilan metode ekstensi.
Alex Humphrey
2
Saya mencuri ide dari Python jika itu membantu!
Dihapus
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();
}
Kyle Rosendo
sumber
3
Pendekatan 2.0 yang bagus. Anda mungkin ingin menjadikan karakter bergabung sebagai parameter daripada melakukan hardcode ke dalam metode.
Anthony Pegram
Pengoptimalan umumnya adalah menambahkan pembatas tanpa pengujian, lalu menghapus karakter terakhir setelah Anda keluar dari loop.
Steven Sudit
@ Steven - Saya sedang memikirkannya, tapi saya pikir ini juga akan tergantung pada panjang string (tanpa pengujian saya tidak yakin), jadi saya tetap menggunakan pemeriksaan bool sederhana.
Kyle Rosendo
Saya menduga pengoptimalan hanya akan terukur untuk string yang panjang. Karena itu, saya tidak berpikir itu akan lebih lambat bahkan untuk yang pendek.
Steven Sudit
3

Memiliki Metode Ekstensi serupa yang saya modifikasi dengan ini

public static class MyExtensions
{
    public static string Join(this List<int> a, string splitChar)
    {
        return string.Join(splitChar, a.Select(n => n.ToString()).ToArray());
    }
}

dan Anda menggunakannya seperti ini

var test = new List<int>() { 1, 2, 3, 4, 5 };
string s = test.Join(",");

.NET 3.5

Jonas Elfström
sumber
Tidak yakin saya suka ini. IEnumerable<T>sudah memiliki sebuah Joinmetode, dan metode baru ini melakukan operasi yang sama sekali berbeda, sehingga penggunaannya berlawanan dengan intuisi. Kedua, jika Anda sedang akan menciptakan metode ini, pergi ke depan dan membuatnya umum yang berlaku.
Anthony Pegram
Ini adalah peretasan yang meniru metode bergabung pada array di Ruby. ruby-doc.org/core/classes/Array.html#M002182
Jonas Elfström
Juga .ToString () tidak selalu mengembalikan representasi string dari T jadi saya rasa itu benar-benar bisa menyebabkan kebingungan.
Jonas Elfström
2

Jawaban ini untuk Anda jika Anda belum ingin menjelajahi lebih dalam .NET 4.0.

String.Join () menggabungkan semua elemen dari array string, menggunakan pemisah yang ditentukan antara setiap elemen.

Sintaksnya adalah

public static string Join(
    string separator,
    params string[] value
)

Daripada meneruskan Daftar int Anda ke metode Gabung, saya sarankan untuk membangun sebuah array string terlebih dahulu.

Inilah yang saya usulkan:

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);
}
Greg
sumber
3
Ini adalah pendekatan yang layak jika seseorang masih menggunakan 2.0. Namun, intArrayitu tidak perlu. List<int>dapat diindeks dan memiliki Countproperti, membuat konversi ke array menjadi berlebihan. Anda juga mungkin ingin menjadikan karakter bergabung sebagai parameter daripada melakukan hardcode ke dalam metode.
Anthony Pegram
2

Menggunakan .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);
    }
}
pengguna436001
sumber
2

Dalam. NET kelas daftar memiliki .ToArray()metode. Sesuatu seperti ini bisa berhasil:

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

Ref: Daftar <T> Metode (MSDN)

wintoch
sumber
Ini answer from 2010sudah menyatakan bahwa, seperti ToStringyang tersirat saat melakukan a string.Join.
Miller