2009-08-07 36 views
9

varsayalım Ben dizeleri bir koleksiyona sahip:Yaratma virgülle ayrılmış değerler

"foo" 
"bar" 
"xyz" 

Ve gibi bir şey listeden virgülle ayrılmış değerler üretmek istiyoruz:

"foo, bar, xyz" 

Bildirimi eksikliği ", " sonunda.

  • kullanım için çevrim ve String.format() veya StringBuilder:

    Bunu oluşturmak için yollar düzinelerce vardır farkındayım.

  • kullanım tamsayı sayacı ve kaldır " 'bitiş eğer değer> 0
  • Birazdan ne ilk vs. vadede

Numune koduna'," koymayın şimdi:

if (strs.Count() > 0) 
{ 
    var sb = new StringBuilder(); 
    foreach (var str in strs) 
    sb.AppendFormat("{0}, ", str); 
    return sb.Remove(0, 2).ToString(); 
} 

Yukarıdaki senaryo için yüksek oranda tekrar kullanılabilen en iyi kod nedir ve neden?

cevap

4

String.Join doğru cevap, ama bir IEnumerable durumunda, Linq döngü için genellikle daha kısadır: Sonra, bir dize dizi veya böyle diyebilirsin başka IEnumerable verilen

someStringCollection.Aggregate((first, second) => first + ", " + second); 
+0

LINQ'in güzel kullanımı! –

26

Bu amaçla BCL'de bulunan string.Join yöntemini kullanmak istiyorsunuz.

Örnek:

var myArray = new string[] { "one", "two", "three" }; 
var output = string.Join(", ", myArray); 

Yoksa .NET 3.5 kullanıyorsanız, aşağıdakiler gibi herhangi IEnumerable<string> ile yapabilirsiniz:

var output = string.Join(", ", myEnumerable.ToArray()); 

(bu en iyi vermez unutmayın Her ne kadar açıkça kullanılsa da, performans hala “O (n)” ve neredeyse tüm durumlar için uygun olmalıdır. senin enumerable tip string (jenerik bir IEnumerable<T>) ait değilse

Şimdi, sadece bir dize, örneğin içine sonucu dönüştürmek Select yöntemi kullanabilirsiniz

var output = string.Join(", ", myEnumerable.Select(e => e.ToString()).ToArray()); 

Ben benzer, sen büyük olasılıkla, kendileri virgül içeren değerlerle uğraşıyoruz ama bu tırnak (") içine alınmak suretiyle çalışılan ve tırnak kaçan olmadığından emin değilim CSV biçimine. geri tekrar bölme Tabii

var output = string.Join(", ", items.Select(x => x.Contains(",") ? 
    "\"" + x.Replace("\"", "\"\"") + "\"" : x); 

, regex biraz gerektirir biraz triciker görevdir. Eğer dize dizisi varsa

+1

Hmm ... Bu işlevi bilmiyordum (soruyu kötüye çeviriyor). –

+0

@Adrian: Endişeye gerek yok. .NET arka planında değilseniz, çerçevede yeni şeyler keşfetmek her zaman kolay değildir - bu, aşinalık oluşturmak için ongoign bir süreçtir. – Noldorin

+1

Sorun şu ki, ilk sürümünden beri .NET yapıyorum. Duh. –

2

Kullanım

string s = string.Join (",", new string[] {"aaa", "bbb", "ccc"}); 
3
string finalstr = String.Join(",", strs); 
0

, Noldorin 'ın çözümü ile gidin.

Fakat diğer bazı toplama tipi ise, bunu yapabilir: Diğerleri söylediler

if (strs.Count() > 0) 
{ 
    var sb = new StringBuilder(); 
    foreach (var str in strs) 
    sb.AppendFormat("{0} {1}", (0 == sb.Length ? "" : ","), str); 
    return sb.ToString(); 
} 
4

gibi: String.Join Bunu yapmanın en iyi yolu normalde olduğunu. Peki ya bir diziden ziyade IEnumerable'ınız varsa? Belki de bunları ertelenmiş yürütme kullanarak bir dosyadan okurken bunları sıralamak için kodunuz vardır. Bu durumda String.Join oldukça güzel değil, çünkü diziyi oluşturmak için bir kez — dizeleri üzerinde bir kez ve ona katılmak için bir kez döngü gerekir. Bu durumda, böyle bir şey daha istiyorum: Bu string.join olarak neredeyse yanı gerçekleştirecek

public static string ToDelimitedString(this IEnumerable<string> source, string delimiter) 
{ 
    string d = ""; 
    var result = new StringBuilder(); 

    foreach(string s in source) 
    { 
     result.Append(d).Append(s); 
     d = delimiter; 
    } 
    return result.ToString(); 
} 

ve daha genel durumda çalışır.

string finalStr = MyStrings.ToDelimitedString(","); 
+0

Evet, görünüşe göre bu daha yaygın senaryo. IEnumerable dizgiden []. –

+0

+1 'result.Append (d) .Append (s)' ilginç… hiç düşünmemiştim bile. Bu basit görevin şu anda kaç farklı şekilde yapıldığını görmek güzel bir şey olurdu. –

+0

Gerçekten harika olan şey, jitter'in normal olarak ekstra ödevleri uzaklaştıracağıdır, bu nedenle kod, ne istediğini _exactly_ yapar. –

İlgili konular