Apa cara paling bersih untuk membuat daftar nilai string yang dipisahkan koma dari IList<string>
atau IEnumerable<string>
?
String.Join(...)
beroperasi pada string[]
sehingga bisa rumit untuk bekerja dengan ketika tipe seperti IList<string>
atau IEnumerable<string>
tidak dapat dengan mudah dikonversi menjadi string array.
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
Jawaban:
.NET 4+
Detail & Pra. Net 4.0 Solusi
IEnumerable<string>
dapat dikonversi menjadi larik string dengan sangat mudah dengan LINQ (.NET 3.5):Cukup mudah untuk menulis metode pembantu yang setara jika Anda perlu:
Kemudian panggil seperti ini:
Anda kemudian dapat menelepon
string.Join
. Tentu saja, Anda tidak harus menggunakan metode pembantu:Yang terakhir ini sedikit suap :)
Ini mungkin menjadi cara paling sederhana untuk melakukannya, dan cukup berkinerja baik - ada pertanyaan lain tentang seperti apa performanya, termasuk (tapi tidak terbatas pada) yang ini .
Pada. NET 4.0, ada lebih banyak kelebihan yang tersedia di
string.Join
, sehingga Anda sebenarnya bisa menulis:Jauh lebih sederhana :)
sumber
List<T>
sebenarnya. Mengapa menemukan kembali roda?ToList
. Tidak apa-apa untuk digunakanstring myStr = string.Join(",", foo.Select(a => a.someInt.ToString()))
.FYI, versi .NET 4.0 dari
string.Join()
memiliki beberapa kelebihan , yang bekerja denganIEnumerable
bukan hanya array, termasuk yang dapat menangani semua jenisT
:sumber
str = emps.Select(e => e.SSN).Join(",")
Cara termudah yang dapat saya lihat untuk melakukan ini adalah menggunakan
Aggregate
metode LINQ :sumber
Func<StringBuilder,string,StringBuider>
. Kemudian panggilToString()
StringBuilder yang dikembalikan. Ini tentu saja tidak secantik :)input.Count
seharusnya lebih dari 1.Saya pikir cara paling bersih untuk membuat daftar nilai string yang dipisahkan koma adalah:
Ini adalah contoh lengkapnya:
Tidak perlu membuat fungsi pembantu, ini dibangun ke dalam. NET 4.0 dan di atas.
sumber
Membandingkan berdasarkan kinerja, pemenangnya adalah "Ulangi, sb. Tambahkan, dan lakukan langkah mundur". Sebenarnya "enumerable dan manual move next" adalah barang yang sama (pertimbangkan stddev).
Kode:
https://github.com/dotnet/BenchmarkDotNet digunakan
sumber
Karena saya sampai di sini ketika mencari untuk bergabung pada properti tertentu dari daftar objek (dan bukan ToString ()), berikut ini adalah tambahan untuk jawaban yang diterima:
sumber
Berikut metode ekstensi lain:
sumber
Tiba sedikit terlambat untuk diskusi ini, tetapi ini adalah kontribusi saya fwiw. Saya harus
IList<Guid> OrderIds
mengkonversikannya ke string CSV tetapi yang berikut bersifat generik dan berfungsi tidak dimodifikasi dengan tipe lain:Pendek dan manis, menggunakan StringBuilder untuk membuat string baru, menyusutkan panjang StringBuilder satu per satu untuk menghilangkan koma terakhir dan mengembalikan string CSV.
Saya telah memperbarui ini untuk menggunakan banyak
Append()
untuk menambahkan string + koma. Dari umpan balik James, saya menggunakan Reflector untuk melihatnyaStringBuilder.AppendFormat()
. TernyataAppendFormat()
menggunakan StringBuilder untuk membangun string format yang membuatnya kurang efisien dalam konteks ini daripada hanya menggunakan banyakAppends()
.sumber
Sesuatu yang agak aneh, tetapi berhasil:
Memberi Anda CSV dari Daftar setelah Anda memberikan konverter (dalam hal ini d => d.DivisionID.ToString ("b")).
Hacky tetapi berhasil - mungkin bisa dibuat menjadi metode ekstensi?
sumber
Inilah cara saya melakukannya, menggunakan cara saya melakukannya dalam bahasa lain:
sumber
Kebutuhan khusus ketika kita harus dikelilingi oleh ', oleh ex:
sumber
Kami memiliki fungsi utilitas, sesuatu seperti ini:
Yang dapat digunakan untuk bergabung dengan banyak koleksi dengan mudah:
Perhatikan bahwa kita memiliki param koleksi sebelum lambda karena intellisense kemudian mengambil jenis koleksi.
Jika Anda sudah memiliki enumerasi string, yang perlu Anda lakukan adalah ToArray:
sumber
Anda bisa mengonversi IList ke array menggunakan ToArray dan kemudian menjalankan perintah string.join pada array.
sumber
Mereka dapat dengan mudah dikonversi ke array menggunakan ekstensi Linq di .NET 3.5.
sumber
Anda juga bisa menggunakan sesuatu seperti berikut ini setelah Anda mengonversinya menjadi array menggunakan salah satu metode yang terdaftar oleh orang lain:
Sunting: Ini adalah contoh lain
sumber
Saya baru saja memecahkan masalah ini sebelum terjadi di artikel ini. Solusi saya berjalan seperti di bawah ini:
Disebut seperti:
Saya juga bisa dengan mudah diungkapkan seperti itu dan juga akan lebih efisien:
sumber
Jawaban saya adalah seperti solusi Agregat di atas tetapi harus lebih sedikit tumpukan panggilan karena tidak ada panggilan delegasi eksplisit:
Tentu saja, seseorang dapat memperluas tanda tangan untuk menjadi pembatas-independen. Saya benar-benar bukan penggemar panggilan sb.Remove () dan saya ingin refactor menjadi straight-up while-loop melalui IEnumerable dan menggunakan MoveNext () untuk menentukan apakah akan menulis koma atau tidak. Saya akan mengutak-atik dan memposting solusi itu jika saya menemukannya.
Inilah yang saya inginkan pada awalnya:
Tidak diperlukan penyimpanan sementara array atau daftar dan tidak ada
StringBuilder
Remove()
atauLength--
hack diperlukan.Di perpustakaan kerangka kerja saya, saya membuat beberapa variasi pada metode tanda tangan ini, setiap kombinasi termasuk
delimiter
danconverter
parameter dengan penggunaan","
danx.ToString()
sebagai default, masing-masing.sumber
Semoga ini adalah cara paling sederhana
sumber
Saya datang ke diskusi ini sambil mencari metode C # yang baik untuk bergabung dengan string seperti yang dilakukan dengan metode MySql
CONCAT_WS()
. Metode ini berbeda daristring.Join()
metode yang tidak menambahkan tanda pemisah jika string NULL atau kosong.akan kembali hanya
Lastname
jika nama depan kosong, sementaraakan kembali
strLastname + ", "
dalam kasus yang sama.Menginginkan perilaku pertama, saya menulis metode berikut:
sumber
Saya menulis beberapa metode ekstensi untuk melakukannya dengan cara yang efisien:
Ini tergantung pada
sumber
Anda dapat menggunakan
.ToArray()
padaLists
danIEnumerables
, dan kemudian menggunakanString.Join()
seperti yang Anda inginkan.sumber
Jika string yang ingin Anda gabungkan ada di Daftar Objek, maka Anda dapat melakukan sesuatu seperti ini juga:
sumber