วิธีการแปลงสตริงทั้งหมดในรายการ <string> เป็นตัวพิมพ์เล็กโดยใช้ LINQ


95

เมื่อวานนี้ฉันเห็นข้อมูลโค้ดในการตอบกลับรายการหนึ่งใน StackOverflow ที่ทำให้ฉันรู้สึกทึ่ง มันเป็นแบบนี้:

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

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

ฉันหวังว่าฉันจะใช้มันเพื่อแปลงรายการทั้งหมดใน myList เป็นตัวพิมพ์เล็ก อย่างไรก็ตามมันไม่เกิดขึ้น ... หลังจากรันสิ่งนี้ปลอกใน myList จะไม่เปลี่ยนแปลง

ดังนั้นคำถามของฉันคือมีวิธีหรือไม่โดยใช้นิพจน์ LINQ และ Lambda เพื่อวนซ้ำและแก้ไขเนื้อหาของรายการในลักษณะที่คล้ายกันนี้

ขอบคุณ Max

คำตอบ:


186

แนวทางที่ง่ายที่สุด:

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

ไม่แตกต่างจากโค้ดตัวอย่างของคุณมากเกินไป ForEachวนConvertAllซ้ำรายการเดิมในขณะที่สร้างรายการใหม่ซึ่งคุณต้องกำหนดใหม่


4
ไม่ใช่วิธีการขยาย
leppie

@leppie: จริงไม่จริง - จับดี ในกรณีนี้การกังวลว่าจะเป็นวิธีการอินสแตนซ์หรือวิธีการขยายอาจเป็นเรื่องเพ้อฝัน แต่ก็ถูกต้องแน่นอน :)
Jason Bunting

และสตริงไม่เปลี่ยนรูป: P
Sherlock

49

นั่นเป็นเพราะ ToLower ส่งคืนสตริงตัวพิมพ์เล็กแทนที่จะแปลงสตริงเดิม ดังนั้นคุณต้องการสิ่งนี้:

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

1
ฉันชอบแนวทางนี้ดีกว่าคำตอบที่ยอมรับเพราะคุณสามารถใช้กับ IEnumerable <string> ไม่ใช่แค่ List <string>
Joshua Pech

6
โซลูชันนี้ยังใช้งานได้ใน. NET Core, ConvertAll ไม่มีอยู่ใน. 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

ForEachใช้Action<T>ซึ่งหมายความว่าคุณอาจได้รับผลกระทบxหากไม่เปลี่ยนรูป เนื่องจากxเป็น a stringจึงไม่เปลี่ยนรูปดังนั้นไม่มีอะไรที่คุณทำในแลมบ์ดาจะเปลี่ยนคุณสมบัติของมัน โซลูชันของ Kyralessa เป็นตัวเลือกที่ดีที่สุดของคุณเว้นแต่คุณต้องการใช้วิธีการขยายของคุณเองซึ่งช่วยให้คุณสามารถส่งคืนค่าทดแทนได้


โปรดค้นคว้าเพิ่มเติมหากคุณไม่แน่ใจ ... จำอะไรได้ไหม?
Patrick Desjardins

ข้อผิดพลาดเป็นของมนุษย์ลิงก์ที่ฉันให้มี 3.5 เป็นตัวหนาและ 2.0 ปกติฉันไม่เห็น ฉันลบโพสต์ไปแล้ว ... ความคิดเห็นง่ายๆจากคุณคงเพียงพอแล้ว คุณต้องการลดคะแนนโดยไม่มีเหตุผลมากกว่าที่คิด
Patrick Desjardins

แม้ว่าฉันจะเขียนเรื่องนี้เกือบหนึ่งปีต่อมาและแม้ว่าฉันจะไม่ใช่ Daok แต่ฉันก็จะบอกคุณว่าทำไมคำตอบของคุณถึง "ผิด" - คุณบอกว่า "โซลูชันของ Kyralessa เป็นตัวเลือกที่ดีที่สุดของคุณ" เมื่อมันไม่ใช่ - โซลูชันของฉันสะอาดกว่า ชัดเจนขึ้น
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"))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.