Bagaimana cara mengonversi semua string dalam List <string> menjadi huruf kecil menggunakan LINQ?

95

Saya melihat cuplikan kode kemarin di salah satu tanggapan di sini di StackOverflow yang membuat saya penasaran. Itu seperti ini:

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

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

Saya berharap saya bisa menggunakannya untuk mengonversi semua item di myList menjadi huruf kecil. Namun, itu tidak terjadi ... setelah menjalankan ini, casing di myList tidak berubah.

Jadi pertanyaan saya adalah apakah ADA cara, menggunakan ekspresi LINQ dan Lambda untuk dengan mudah mengulang dan mengubah konten daftar dengan cara yang mirip dengan ini.

Terima kasih, Max

Max Schilling
sumber

Jawaban:

186

Pendekatan termudah:

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

Tidak terlalu jauh berbeda dengan kode contoh Anda. ForEachmengulang daftar asli sambil ConvertAllmembuat yang baru yang perlu Anda tetapkan kembali.

Jason Bunting
sumber
4
Bukan metode ekstensi.
leppie
@leppie: Benar, ini tidak - tangkapan yang bagus. Dalam kasus ini, mengkhawatirkan apakah itu metode instance atau metode ekstensi mungkin agak berlebihan, tetapi ini pasti akurat. :)
Jason Bunting
Dan senar tidak dapat diubah: P
Sherlock
49

Itu karena ToLower mengembalikan string huruf kecil daripada mengubah string asli. Jadi Anda menginginkan sesuatu seperti ini:

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
Ryan Lundy
sumber
1
Saya menyukai pendekatan ini lebih baik daripada jawaban yang diterima karena Anda dapat menggunakan ini dengan IEnumerable <string>, bukan hanya List <string>.
Joshua Pech
6
Solusi ini juga berfungsi di .NET Core, ConvertAll tidak ada di .NET Core.
Jonas
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");
}
marcumka
sumber
3

ForEachpenggunaan Action<T>, yang berarti bahwa Anda dapat memengaruhi xjika tidak dapat diubah. Karena xa string, itu tidak dapat diubah, jadi tidak ada yang Anda lakukan di lambda yang akan mengubah propertinya. Solusi Kyralessa adalah pilihan terbaik Anda kecuali Anda ingin menerapkan metode ekstensi Anda sendiri yang memungkinkan Anda mengembalikan nilai pengganti.

Michael Meadows
sumber
Silakan lakukan lebih banyak penelitian jika Anda tidak yakin ... ingat sesuatu?
Patrick Desjardins
Kesalahan adalah manusia, tautan yang saya berikan memiliki 3,5 huruf tebal dan 2,0 normal, saya belum melihatnya. Saya telah menghapus posting saya ... komentar sederhana dari Anda sudah cukup. Anda ingin memberi suara negatif tanpa alasan, daripada anggapan sekarang.
Patrick Desjardins
Meskipun saya menulis ini hampir setahun kemudian, dan meskipun saya bukan Daok, saya akan memberi tahu Anda mengapa jawaban Anda "salah" - Anda mengatakan "Solusi Kyralessa adalah pilihan terbaik Anda" padahal bukan - solusi saya lebih bersih dan lebih jelas.
Jason Bunting
-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"))
Uhlamurile
sumber