Widziałem wczoraj fragment kodu w jednej z odpowiedzi na StackOverflow, który mnie zaintrygował. To było coś takiego:
List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};
myList.ForEach(d=>d.ToLower());
Miałem nadzieję, że uda mi się go użyć do przekonwertowania wszystkich elementów w myList na małe litery. Jednak tak się nie dzieje ... po uruchomieniu tego, obudowa w myList pozostaje niezmieniona.
Moje pytanie brzmi więc, czy istnieje sposób użycia wyrażeń LINQ i Lambda do łatwego iterowania i modyfikowania zawartości listy w sposób podobny do tego.
Dzięki, Max
Dzieje się tak, ponieważ ToLower zwraca ciąg z małych liter, zamiast konwertować oryginalny ciąg. Więc chciałbyś coś takiego:
List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
źródło
[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"); }
źródło
ForEach
używaAction<T>
, co oznacza, że mógłbyś wpłynąć,x
gdyby nie był niezmienny. Ponieważx
jest astring
, jest niezmienna, więc nic, co zrobisz z nim w lambdzie, nie zmieni jego właściwości. Rozwiązanie Kyralessa jest najlepszą opcją, chyba że chcesz zaimplementować własną metodę rozszerzenia, która umożliwia zwrócenie wartości zastępczej.źródło
var _reps = new List(); // with variant data _reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))
źródło