2009-11-10 25 views
7

LINQ aracılığıyla bir string oluşturucuya eklemek istediğim bir String dizilim var.LINQ bir String'den bir StringBuilder eklemek için []

Temelde söylemeye çalıştığım şey "Bu dizideki her öğe için bu StringBuilder ürününe bir satır ekleyin".

Bunu bir foreach döngüsünü kullanarak kolayca yapabilirim, ancak aşağıdaki kod hiçbir şey yapmıyor gibi görünüyor. Neyi kaçırıyorum?

stringArray.Select(x => stringBuilder.AppendLine(x)); 

bu çalışır şekilde Burada:

foreach(String item in stringArray) 
{ 
    stringBuilder.AppendLine(item); 
} 
+0

.Select komutunu kullanamazdım ... ForEach komutu kullanılabilir değil mi? – sebagomez

+0

StringBuilder ve StringArray adını küçük harf ilk harfini kullanacak şekilde yeniden adlandırdım. Sadece örnek değişkenlere değil türlere başvurduğumu açıkça belirtmek için. –

+0

evet ... http://msdn.microsoft.com/en-us/library/zecdkyw2.aspx :) 'DoForAll' nedir – sebagomez

cevap

18

Bir LINQy bir şekilde yapmakta ısrar ederse:

StringBuilder builder = StringArray.Aggregate(
          new StringBuilder(), 
          (sb, s) => sb.AppendLine(s) 
         ); 

Alternatif Luke başka yayının yorumunda işaret ettiği gibi, sen

Array.ForEach(StringArray, s => stringBuilder.AppendLine(s)); 

Select yaptığı nedeni söyleyebiliriz İşe yaramamak, Select projeksiyon için bir IEnumerable yansıtmak ve oluşturmak içindir. Yani

StringArray.Select(s => stringBuilder.AppendLine(s)) 

kod

hattı her tekrarında stringBuilder.AppendLine(s) çağıran StringArray üzerinde yineleme etmez. Bunun yerine, üzerinde numaralandırılabilen bir IEnumerable<StringBuilder> oluşturur.

Sana

var e = stringArray.Select(x => stringBuilder.AppendLine(x)); 
StringBuilder sb = e.Last(); 
Console.WriteLine(sb.ToString()); 

söyleyebiliriz ama bu gerçekten iğrenç olduğunu varsayalım.

+0

Teşekkürler Jason. Cevabınız, Select yönteminin neden istediğim sonuca ulaşmadığını ve foreach'ın neden çalıştığını açıklıyor. Ben foreach ile bağlı kalacağım. Gerçekten neyi kaçırdığımı merak ediyordum. Şimdi biliyorum. –

+0

Last() tekrarlanacak mı? StringArray [stringArray.count-1] 'i getirmek yerine mi? Ben ToList(); – Taemyr

0

StringArray.DoForAll (x => StringBuilder.AppendLine (x));

+0

nedir? – jason

+0

Üzgünüz, bu uzatma yöntemini çok uzun zamandır kullandım, unuttuğum çerçevenin bir parçası değil. \t kamu statik sınıf CommonExtensions \t { \t \t public void DoForAll (bu IEnumerable ürün, Eylem eylem) \t \t \t T: Sınıf \t \t { \t \t \t if (eylem == null) \t \t \t yeni ArgumentNullException ("eylem") atar; \t \t \t foreach (öğeleri var item) \t \t \t \t eylem (madde); \t \t \t \t} } – vladhorby

+0

@vladhorby: DoForAll' ve diğer eşdeğer uzantıları uygulanmadı neden 'One görünüm: http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs -foreach.aspx – jason

6

yerine "Seç" nin "ForEach" uzantısı yöntemi kullanın.

stringArray.ForEach(x => stringBuilder.AppendLine(x)); 
İlgili konular