2008-10-23 19 views
73

Dün beni kodlayan StackOverflow'taki yanıtlardan birinde bir kod snippet'i gördüm. Ben küçük harfe mylist tüm öğeleri dönüştürmek için kullanabilirsiniz umuyordumList <string>'daki tüm dizeleri LINQ kullanarak küçük harf nasıl?

List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"}; 

myList.ForEach(d=>d.ToLower()); 

: Böyle bir şeydi. Ancak, bunu yaptıktan sonra ... listemizdeki kasa değişmez.

Benim soru kolayca yineleme ve buna benzer bir şekilde bir listenin içeriğini değiştirmek için LINQ ve Lambda ifadeleri kullanarak, bir yolu var IS olup olmadığıdır. Orijinal dize dönüştürme daha çünkü ToLower döner bir küçük dize yerine var

sayesinde Max

cevap

131

En kolay yaklaşım: örnek kodla daha çok fazla farklı

myList = myList.ConvertAll(d => d.ToLower()); 

değil. ForEach, orijinal listesini döngülerken ConvertAll, yeniden atamanız gereken yeni bir tane oluşturur. Eğer sadece Liste , IEnumerable ile kullanabilirsiniz çünkü

+4

Bir uzantı yöntemi değil. – leppie

+0

@leppie: Doğru, değil - iyi yakalama. Bu durumda, bir örnek yöntemi mi yoksa bir uzantı yöntemi mi olduğu konusunda endişe etmek biraz bilgi verebilir, ancak kesinlikle doğrudur. :) –

+0

Ve dize değişmez: P – Sherlock

3
[TestMethod] 
public void LinqStringTest() 
{ 
    List<string> myList = new List<string> { "aBc", "HELLO", "GoodBye" }; 
    myList = (from s in myList select s.ToLower()).ToList(); 
    Assert.AreEqual(myList[0], "abc"); 
    Assert.AreEqual(myList[1], "hello"); 
    Assert.AreEqual(myList[2], "goodbye"); 
} 
34

.

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList(); 
+1

ben kabul edilen yanıt daha bu yaklaşım daha çok sevdim. –

+5

Bu çözüm, .NET Core'da da çalışır, ConvertAll .NET Core'da bulunmaz. –

3

ForEachAction<T> kullanır, bu değişmez olmasaydı sen x etkileyebilecek anlamına gelir: Yani böyle bir şey isterdi. x, bir string olduğundan, bu değişmezdir, bu yüzden lambdada yaptığınız hiçbir şey özelliklerini değiştirmeyecektir. Kyralessa'nın çözümü, kendi değerinizde bir değiştirme değeri vermenizi sağlayan uzantı yönteminizi uygulamak istemediğiniz sürece en iyi seçeneğinizdir.

+0

Lütfen emin değilseniz daha fazla araştırma yapın ... bir şey hatırlıyor musunuz? –

+0

Hata, insanım, sağladığım bağlantı 3.5, kalın ve 2,0 normal, ben görmedim. Gönderiyi sildim ... sizden basit bir yorum yeterli olurdu. Hiçbir sebepten ötürü reddetmek istiyorsun, artık varsayımdan. –

+0

Neredeyse bir yıl sonra yazmam ve her ne kadar ben Daok olmasam da, cevabın neden "yanlış" olduğunu söyleyeceğim - "Kyralessa'nın çözümü en iyi seçeneğin" dediğinde - çözümüm daha temiz ve daha net. –

-1
var _reps = new List(); // with variant data 

_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))