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

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.


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();

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

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.


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"))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.