Как преобразовать все строки в списке<string> в нижний регистр с помощью LINQ?

StackOverflow https://stackoverflow.com/questions/230973

  •  04-07-2019
  •  | 
  •  

Вопрос

Вчера я увидел фрагмент кода в одном из ответов здесь, на 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"))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top