2008-10-23 3 views
73

Вчера я увидел фрагмент кода в одном из ответов здесь, на StackOverflow, который заинтриговал меня. Это было что-то вроде этого:Как преобразовать все строки в список <string> в нижний регистр с помощью LINQ?

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

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

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

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

Спасибо, Max

ответ

131

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

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

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

3
[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"); 
} 
34

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

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList(); 
+1

Мне нравится этот подход лучше, чем принято отвечать, потому что вы можете использовать это с любым IEnumerable , а не просто список . – 2015-03-02 20:49:50

+5

Это решение также работает в .NET Core, ConvertAll не существует в .NET Core. – 2017-04-07 07:30:09

3

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

+0

Пожалуйста, сделайте больше исследований, если вы не уверены ... помните что-то? – 2008-10-27 11:46:50

-1
var _reps = new List(); // with variant data 

_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))