2013-02-15 24 views
11

Bu ForEach'in neden çalışmadığını ve değerleri boşluk bırakarak neden bıraktığını merak ettim.ForEach to string dizilimindeki dize değerlerini düzeltme

string days = "Monday, Tuesday, Wednesday, Thursday, Friday"; 

string[] m_days = days.Split(','); 

m_days.ToList().ForEach(d => { d = d.Trim(); }); 

Ben bu yüzden gerek yoktur ve orada cevap Bunu yapmanın başka yolları vardır biliyorum.

cevap

19

Eğer kesilmiş dizeleri yeniden atama değildir çünkü.

var list = m_days.Split(',').Select(s => s.Trim()).ToList(); 
ben yanlış ForEach kullanıyorum eğer ForEach çalışmazsa veya Neden

?

ForEach Linq değil, bu bir List<T> yöntemidir. Yaptığınız şey temel olarak şu:

+0

Evet, neden ForEach çalışmıyor ya da ForEach'i yanlış kullanıyorum. Seçiniz ifadesini kullanabileceğinizi biliyorum ... – David

+0

@David: Lütfen bu görev için neden 'ForEach' kullanamadığınızı açıklayan bir açıklama için yanıtıma bakın. –

+1

@David: 'ForEach' Linq değil, 'List ' yöntemidir. Cevabımı düzenledim. –

4

Öyle gibi yeni bir değişken için ForEach çıktısını atamanız gerekir: Orijinal dize değişiklik yapmayın

var trimmedResult = m_days.Select(d => d.Trim()).ToList(); 
3

String.Trim() çünkü. ForEach(d => d.Trim())'u aradığınızda, listedeki her öğe için bellekte yeni kırpılmış dize oluşturursunuz, ancak bu dize hiçbir yere atanmaz. Yaptığın şey bu: Size gerekenler

foreach(string d in list) 
{ 
    d.Trim(); 
} 

m_days = days.Split(',').Select(d => d.Trim()).ToArray(); 
+1

Wow. Birisi String.Trim'in orijinal dizgisini değiştirdiğini düşünüyor? –

3

string.Trim yeni dize örneği döndürür. Yani bir şekilde 'u yeni örnek kullanmalısınız.
Bunu kodunuzda yapmıyorsunuz.
Ayrıca, ForEach ile mümkün değildir.

m_days.ToList().ForEach(d => { d = d.Trim(); }); 

Ama d referans olarak geçmedi nedeniyle yalnızca temsilci içine geçti yerel parametresini değişiyor böylece, ya yardım edecek değildir: İlk bakışta, şu işe yarayabilir ve listede saklanan örneği değil.

Büyük olasılıkla bu istiyorum:

var result = days.Split(',').Select(x => x.Trim()).ToList(); 

LINQ olmadan alternatif bir yolu şu şekilde görünecektir:

var split = days.Split(','); 
for(int i = 0; i < split.Length; ++i) 
    split[i] = split[i].Trim(); 
+0

beni gönderiye yendi ama bu en iyi çözüm imo – JMan

+0

Tamam, başka alternatifler göndermenize gerek yok. Alternatifleri biliyorum. ForEach'in kullanımını yanlış anladığımı düşünüyorum. Sadece Foreach'ın neden tam olarak çalışmadığını öğrenmek istedim. – David

+0

@David: Peki, bu benim cevabımda ilk kod snippet'inden sonraki kısımda açıklandı. –

İlgili konular