Як перетворити всі рядки у списку <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.