Как конвертировать все строки в списке <string>в нижний регистр, используя LINQ? - PullRequest
81 голосов
/ 23 октября 2008

Вчера я видел фрагмент кода в одном из ответов на StackOverflow, который меня заинтриговал. Это было что-то вроде этого:

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

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

Я надеялся, что смогу использовать его для преобразования всех элементов в myList в нижний регистр. Тем не менее, этого не происходит ... после выполнения этого, оболочка в myList остается неизменной.

Поэтому мой вопрос заключается в том, существует ли способ, использующий выражения LINQ и Lambda, чтобы легко перебирать и изменять содержимое списка способом, подобным этому.

Спасибо, Max

Ответы [ 5 ]

154 голосов
/ 23 октября 2008

Самый простой подход:

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

Не слишком сильно отличается от вашего примера кода. ForEach повторяет исходный список, тогда как ConvertAll создает новый, который необходимо переназначить.

40 голосов
/ 23 октября 2008

Это потому, что ToLower возвращает строчную строку вместо преобразования исходной строки. Итак, вы хотите что-то вроде этого:

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
3 голосов
/ 23 октября 2008

ForEach использует Action<T>, что означает, что вы могли бы повлиять на x, если бы оно не было неизменным. Поскольку x является string, он неизменен, поэтому ничего, что вы делаете с ним в лямбде, не изменит его свойств. Решение Kyralessa - ваш лучший вариант, если вы не хотите реализовать собственный метод расширения, который позволяет вам возвращать заменяющее значение.

3 голосов
/ 23 октября 2008
[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");
}
0 голосов
/ 07 марта 2013
var _reps = new List(); // with variant data

_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...