2010-08-26 15 views
325

Bazı koleksiyonları hızlı bir şekilde dizeye dönüştürmek ve ayırıcı ile ayırmak için C# işlevinde bir işlev var mı? ÖrneğinC# Liste <string> sınırlayıcı ile dize

:

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

cevap

617

Sen String.Join kullanabilirsiniz. Eğer bir List<string> varsa o zaman ToArray ilk çağırabilirsiniz: Bir IEnumerable<string> alır String.Join bir aşırı yük olmadığından

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

.NET 4'te sen artık ToArray gerekmez. Ben Quartermeister yanıtında olmayan linq sözdizimi tercih ederim ve Aggregate yavaş (muhtemelen daha dize birleştirme işlemleri) gerçekleştirmek düşünüyorum olsa da

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

isterseniz

44

Ayrıca linq ile yapabilirsiniz.

+6

Hızlı yanıtlar için teşekkürler, her ikisi de iyi çalışıyor. Haklısın, Stopwatch 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ı Agrega ((a, b) => a + "," + b) -> 736 keneler aldı – nan

+1

Evet "Agrega" Matematik tipi işlemler için daha iyi olduğunu düşünüyorum. Bu işlem dizgilerle, her bir öğe için benzerdir ve sadece verimsiz olarak çok yavaş olan bir dizeye eklenir, çünkü listede bulunan her öğe için yeni bir dize yaratırsınız. – Bob

+0

Bir çekirdek değeri olmayan Toplama, kapsayıcı boşsa InvalidOperationException atar. Hata işleme kodu veya koşullu kontrollerden kaçınmak için ekili sürüm Agrega (tohum, func) kullanın. String.Join boş bırakmaz, böylece tohum veya ekstra kod gerekmez ... Ayrıca Linq gerektirmez ve sözdizimi biraz daha nettir. – Huacanacha

-2
List<string> targets = new List<string>(); 

var InboxChecked = true; 
var BannerChecked = false; 
var EmailChecked = true; 

if (InboxChecked) 
{ 
    targets.Add("Inbox"); 
} 

if (BannerChecked) 
{ 
    targets.Add("Banner"); 
} 

if (EmailChecked) 
{ 
    targets.Add("Email"); 
} 

var index = 0; 

if (targets.Any()) 
{ 
    var aggregate = targets.Aggregate((s1, s2) => 
    { 
     return ++index == targets.Count - 1 ? s1 + " and " + s2 : s1 + ", " + s2; 
    }); 

    // aggregate.Dump(); 
} 

// returns -> Inbox and Email 
+8

Bu neden burada? OP ile neredeyse hiç ilgisi yok mu? – Assimilater