Вчера я увидел фрагмент кода в одном из ответов на StackOverflow, который меня заинтриговал. Это было примерно так:
List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};
myList.ForEach(d=>d.ToLower());
Я надеялся, что смогу использовать его для преобразования всех элементов в myList в нижний регистр. Однако этого не происходит ... после запуска этого регистр в myList не изменяется.
Итак, мой вопрос: есть ли способ с помощью LINQ и лямбда-выражений легко перебирать и изменять содержимое списка аналогично этому.
Спасибо Макс
Это потому, что ToLower возвращает строку в нижнем регистре, а не преобразовывает исходную строку. Итак, вам нужно что-то вроде этого:
List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
источник
[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"); }
источник
ForEach
usesAction<T>
, что означает, что вы могли бы повлиять,x
если бы он не был неизменным. Посколькуx
это astring
, оно неизменяемо, поэтому никакие действия с ним в лямбде не изменят его свойства. Решение Kyralessa - ваш лучший вариант, если вы не хотите реализовать собственный метод расширения, который позволяет вам возвращать значение замены.источник
var _reps = new List(); // with variant data _reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))
источник