C # Sınırlayıcı ile dizeye <string> listesi


631

C # 'da bazı koleksiyonları hızlı bir şekilde dizeye dönüştürmek ve değerleri ayırıcı ile ayırmak için bir fonksiyon var mı?

Örneğin:

List<string> names -> string names_together = "John, Anna, Monica"

Yanıtlar:


1201

Kullanabilirsiniz String.Join. Eğer bir List<string>hesabınız varsa ToArrayönce arayabilirsiniz :

List<string> names = new List<string>() { "John", "Anna", "Monica" };
var result = String.Join(", ", names.ToArray());

.NET 4'te İhtiyacınız olmayan ToArraybir aşırı yük olmadığından, artık String.Joino bir sürer IEnumerable<string>.

Sonuçlar:


John, Anna, Monica


95

İsterseniz bunu linq ile de yapabilirsiniz

var names = new List<string>() { "John", "Anna", "Monica" };
var joinedNames = names.Aggregate((a, b) => a + ", " + b);

Her ne kadar Quartermeister'ın cevabında linq olmayan sözdizimini tercih etsem Aggregatede, daha yavaş (muhtemelen daha fazla dize birleştirme işlemleri) gerçekleştirebileceğini düşünüyorum .


19
Hızlı cevaplar için teşekkürler, her ikisi de iyi çalışıyor. Haklısın Kronometre sınıfını kullanarak küçük bir performans ölçümü yaptım ve linq-way çok daha yavaş: String.Join (",", names.ToArray ()); -> 18 keneler aldı Toplam ((a, b) => a + "," + b) -> 736 keneler aldı
nan

2
Evet Aggregate, matematik tipi işlemler için daha iyi olduğunu düşünüyorum . Dizelerle bu işlem for each, listede var olan her öğe için yeni bir dize oluşturduğunuz için verimsiz çok yavaş bir dizeye ing ve eklemeye benzer .
Bob 13:

Çekirdek değeri olmayan Toplama'nın kap boşsa InvalidOperationException özel durumunu atacağını unutmayın. Hata işleme kodunu veya koşullu denetimleri önlemek için ekilmiş sürüm Toplama'yı (ekim, işlev) kullanın. String.Join boş bırakılmaz, bu nedenle tohum veya ekstra kod gerekmez ... artı Linq gerektirmez ve sözdizimi biraz daha açıktır.
Huacanacha

1
StringBuilder kullanırsanız, yukarıdaki örnekte toplama daha hızlı çalışabilir. Birden fazla birleştirme gerçekleştirmek için '+' kullanılması önerilmez. Buradaki Açıklamalar bölümüne bakın ( msdn.microsoft.com/en-us/library/… )
Ilya Denisov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.