Як перетворити всі рядки у списку <string> на малі регістри за допомогою LINQ?


94

Вчора я побачив фрагмент коду в одній з відповідей тут, на StackOverflow, яка мене заінтригувала. Це було приблизно так:

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

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

Я сподівався, що зможу використати його для перетворення всіх елементів у моєму Списку в малі літери. Однак цього не відбувається ... після запуску цього кожух у myList залишається незмінним.

Отже, моє питання полягає в тому, чи Є спосіб, використовуючи вирази LINQ та Lambda, щоб легко переглядати та модифікувати вміст списку подібним чином.

Дякую, Макс

Відповіді:


182

Найпростіший підхід:

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

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


4
Не метод розширення.
леппі

@leppie: Правда, це не так - хороший улов. У цьому випадку турбота про те, чи це метод екземпляра чи метод розширення, може бути дещо педантичною, але це точно точно. :)
Джейсон Бантінг,

І рядок незмінний: P
Шерлок

48

Це тому, що ToLower повертає рядок у нижньому регістрі, а не перетворює початковий рядок. Отже, ви хотіли б щось подібне:

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

1
Мені подобається такий підхід більше, ніж прийнята відповідь, тому що ви можете використовувати його з будь-яким IEnumerable <string>, а не лише зі списком <string>.
Джошуа Печ

6
Це рішення також працює в .NET Core, ConvertAll не існує в .NET Core.
Йонас

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

3

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


Будь ласка, проведіть більше досліджень, якщо ви не впевнені ... щось пам’ятаєте?
Патрік Дежардінс,

Помилка є людською, посилання, яке я надав, мав жирний жир 3,5 та 2,0 звичайний, я цього не бачу. Я видалив свою публікацію ... достатньо було б простого коментаря від вас. Ви хочете проголосувати проти будь-якої причини, ніж тепер вважаємо.
Патрік Дежардінс,

Хоча я пишу це майже рік потому, і хоча я не Даок, я скажу вам, чому ваша відповідь "неправильна" - ви сказали "Рішення Кіралесси - це ваш найкращий варіант", коли це не так - моє рішення є чистішим і чіткіше.
Джейсон Бантінг,

-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"))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.