Membuat daftar dipisahkan koma dari IList atau IEnumerable
Apa yang terbersih cara untuk membuat daftar dipisahkan koma nilai string dari sebuah IList<string>
atau IEnumerable<string>
?
String.Bergabung(...)
beroperasi string[]
sehingga dapat menjadi rumit untuk bekerja dengan ketika jenis seperti IList<string>
atau IEnumerable<string>
tidak dapat dengan mudah diubah menjadi array string.
800
21
.NET 4+
Detail & Pre .Net 4.0 Solusi
IEnumerable<string>
dapat dikonversi menjadi string array *sangat mudah dengan LINQ (.NET 3.5):It's cukup mudah untuk menulis setara dengan metode penolong jika anda perlu untuk:
Kemudian menyebutnya seperti ini:
Anda kemudian dapat memanggil
string.Bergabung
. Tentu saja, anda don't memiliki untuk menggunakan metode penolong:Yang terakhir ini sedikit seteguk sekalipun :)
Ini mungkin cara paling sederhana untuk melakukannya, dan sangat performant juga - ada pertanyaan lain tentang apa kinerja yang suka, termasuk (namun tidak terbatas pada) ini.
Sebagai dari .NET 4.0, ada lebih overloads tersedia di
string.Bergabung
, sehingga anda dapat benar-benar hanya menulis:Jauh lebih sederhana :)
FYI,.NET versi 4.0 dari
string.Join()
memiliki beberapa extra overload, yang bekerja denganIEnumerable
bukan hanya array, termasuk salah satu yang dapat menangani semua jenisT
:Cara termudah yang saya bisa melihat untuk melakukan hal ini adalah dengan menggunakan LINQ
Agregat
metode:Saya berpikir bahwa terbersih cara untuk membuat daftar dipisahkan koma nilai string adalah sederhana:
Berikut adalah contoh:
Ada tidak perlu untuk membuat fungsi pembantu, hotel yang dibangun ke .NET 4.0 dan di atas.
Membandingkan dengan kinerja pemenangnya adalah "Lingkaran itu, sb.Menambahkan hal itu, dan lakukan kembali langkah". Sebenarnya "enumerable dan panduan langkah berikutnya" adalah sama baik (mempertimbangkan stddev).
Kode:
https://github.com/dotnet/BenchmarkDotNet digunakan
Sejak saya sampai di sini sementara mencari untuk bergabung pada properti tertentu dari daftar benda-benda (dan tidak ToString() itu) di sini's untuk jawaban yang diterima:
Berikut ini's ekstensi lain metode:
Tiba sedikit terlambat untuk diskusi ini tapi ini adalah kontribusi saya fwiw. Saya memiliki sebuah
IList<I> OrderIds
akan dikonversi ke CSV string tapi berikut adalah generik dan bekerja dimodifikasi dengan jenis lain:Pendek dan manis, menggunakan StringBuilder untuk membangun new string, menyusut StringBuilder panjang per satu untuk menghapus koma terakhir dan kembali CSV string.
I've ini diperbarui untuk menggunakan beberapa
Append()
's untuk menambahkan string + koma. Dari James' umpan balik yang saya digunakan Reflektor untuk melihatStringBuilder.AppendFormat()
. TernyataAppendFormat()
menggunakan StringBuilder untuk membangun format string yang membuatnya kurang efisien dalam konteks ini daripada hanya menggunakan beberapaMenambahkan()
's.Sesuatu yang sedikit jelek, tapi itu bekerja:
Memberikan anda CSV dari Daftar setelah anda memberikan converter (dalam hal ini d => d.DivisionID.ToString("b")).
Hacky tapi karya - karya yang bisa dibuat menjadi sebuah metode penyuluhan mungkin?
Kebutuhan spesifik ketika kita harus mengelilingi oleh ', oleh ex:
Berikut ini's cara yang saya lakukan itu, dengan menggunakan cara yang telah saya lakukan itu dalam bahasa lain:
Kita memiliki sebuah fungsi utilitas, sesuatu seperti ini:
Yang dapat digunakan untuk bergabung dengan banyak koleksi dengan mudah:
Perhatikan bahwa kita memiliki koleksi param sebelum lambda karena intellisense kemudian mengambil jenis koleksi.
Jika anda sudah memiliki sebuah enumerasi string semua yang perlu anda lakukan adalah ToArray:
Jawaban saya adalah seperti di atas Agregat solusi tapi harus kurang panggilan-tumpukan berat karena tidak ada eksplisit delegasi panggilan:
Tentu saja, seseorang dapat memperpanjang tanda tangan untuk menjadi pembatas-independen. I'm benar-benar bukan penggemar sb.Hapus() call dan I'd seperti untuk refactor itu menjadi lurus-up sementara loop di atas IEnumerable dan menggunakan MoveNext() untuk menentukan apakah atau tidak untuk menulis koma. I'll bermain-main di sekitar dan di post itu solusi jika aku datang pada saat itu.
Berikut ini's apa yang saya inginkan awalnya:
Ada sementara array atau list bagasi yang diperlukan dan tidak ada
StringBuilder
Remove()
atauPanjang--
hack diperlukan.Dalam kerangka perpustakaan saya membuat beberapa variasi pada metode ini tanda tangan, setiap kombinasi termasuk
pembatas
danconverter
parameter dengan penggunaan","
danx.ToString()
sebagai default, masing-masing.Mereka dapat dengan mudah dikonversi ke array menggunakan Linq ekstensi .NET 3.5.
anda dapat mengkonversi IList untuk menggunakan array ToArray dan kemudian menjalankan sebuah string.bergabung perintah pada array.
Mudah-mudahan ini adalah cara paling sederhana
Aku baru saja menyelesaikan masalah ini sebelum terjadi di artikel ini. Solusi saya pergi sesuatu seperti di bawah ini :
Disebut seperti:
Saya juga bisa saja dengan mudah menyatakan seperti itu dan juga telah lebih efisien:
Aku datang atas diskusi ini sambil mencari yang baik C# metode untuk bergabung dengan string seperti itu dilakukan dengan MySql metode
CONCAT_WS()
. Metode ini berbeda daristring.Join()
metode dalam hal itu tidak menambahkan tanda pemisah jika string NULL atau kosong.akan kembali hanya
Lastname
jika nama depan kosong, sementaraakan kembali
strLastname + ", "
dalam kasus yang sama.Ingin pertama perilaku, aku menulis metode berikut:
Anda juga bisa menggunakan sesuatu seperti berikut setelah anda telah dikonversi ke array menggunakan salah satu dari metode yang terdaftar oleh orang lain:
Edit: di Sini adalah contoh lain
Saya menulis beberapa metode ekstensi untuk melakukannya dengan cara yang's efisien:
Hal ini tergantung pada