Как преобразовать все строки в списке<string> в нижний регистр с помощью LINQ?
Вопрос
Вчера я увидел фрагмент кода в одном из ответов здесь, на StackOverflow, который меня заинтриговал.Это было что - то вроде этого:
List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};
myList.ForEach(d=>d.ToLower());
Я надеялся, что смогу использовать его для преобразования всех элементов в myList в нижний регистр.Однако этого не происходит...после выполнения этой операции оболочка в myList остается неизменной.
Итак, мой вопрос заключается в том, существует ли способ, используя LINQ и лямбда-выражения, легко перебирать и изменять содержимое списка способом, подобным этому.
Спасибо, Макс
Решение
Самый простой подход:
myList = myList.ConvertAll(d => d.ToLower());
Не слишком сильно отличается от вашего примера кода. ForEach
зацикливает исходный список , тогда как ConvertAll
создает новый, который вам нужно переназначить.
Другие советы
Это потому, что меньше ВОЗВРАТ строка в нижнем регистре, а не преобразование исходной строки.Итак, вы хотели бы что-то вроде этого:
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
использование Action<T>
, что означает , что вы могли бы повлиять x
если бы это не было неизменяемым.С тех пор как x
является string
, он неизменяем, поэтому ничто из того, что вы делаете с ним в лямбда-выражении, не изменит его свойств.Решение 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"))