Làm thế nào để chuyển đổi tất cả các chuỗi trong List <string> thành chữ thường bằng LINQ?


94

Tôi đã thấy một đoạn mã ngày hôm qua trong một trong những phản hồi ở đây trên StackOverflow khiến tôi tò mò. Đó là một cái gì đó như thế này:

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

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

Tôi đã hy vọng mình có thể sử dụng nó để chuyển đổi tất cả các mục trong MyList thành chữ thường. Tuy nhiên, nó không xảy ra ... sau khi chạy điều này, vỏ trong myList không thay đổi.

Vì vậy, câu hỏi của tôi là liệu có cách nào, sử dụng các biểu thức LINQ và Lambda để dễ dàng lặp lại và sửa đổi nội dung của danh sách theo cách tương tự như thế này không.

Cảm ơn, Max

Câu trả lời:


182

Cách tiếp cận dễ nhất:

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

Không khác quá nhiều so với mã ví dụ của bạn. ForEachlặp lại danh sách ban đầu trong khi ConvertAlltạo một danh sách mới mà bạn cần chỉ định lại.


4
Không phải là một phương pháp mở rộng.
leppie

@leppie: Đúng, không phải - bắt tốt. Trong trường hợp này, lo lắng về việc liệu nó là một phương thức thể hiện hay một phương thức mở rộng có thể hơi phức tạp, nhưng nó chắc chắn là chính xác. :)
Jason Bunting

Và chuỗi là bất di bất dịch: P
Sherlock

48

Đó là bởi vì ToLower trả về một chuỗi chữ thường chứ không phải chuyển đổi chuỗi gốc. Vì vậy, bạn muốn một cái gì đó như thế này:

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

1
Tôi thích cách tiếp cận này hơn câu trả lời được chấp nhận vì bạn có thể sử dụng cách này với bất kỳ <string> nào của IEnumerable, không chỉ với List <string>.
Joshua Pech

6
Giải pháp này cũng hoạt động trong .NET Core, ConvertAll không tồn tại trong .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

ForEachsử dụng Action<T>, có nghĩa là bạn có thể ảnh hưởng xnếu nó không phải là bất biến. Vì xlà a string, nó là bất biến, nên bạn không làm gì với nó trong lambda sẽ thay đổi thuộc tính của nó. Giải pháp của Kyralessa là lựa chọn tốt nhất của bạn trừ khi bạn muốn triển khai phương pháp mở rộng của riêng mình cho phép bạn trả về giá trị thay thế.


Vui lòng nghiên cứu thêm nếu bạn không chắc ... nhớ điều gì?
Patrick Desjardins 27/10/08

Lỗi là do con người, liên kết tôi cung cấp có 3.5 in đậm và 2.0 bình thường, tôi không nhìn thấy nó. Tôi đã xóa bài đăng của mình ... một bình luận đơn giản từ bạn là đủ. Bạn không muốn phản đối không có lý do, hơn là bây giờ giả định.
Patrick Desjardins 27/10/08

Mặc dù tôi viết bài này gần một năm sau, và mặc dù tôi không phải là Daok, tôi sẽ cho bạn biết tại sao câu trả lời của bạn là "sai" - bạn đã nói "Giải pháp của Kyralessa là lựa chọn tốt nhất của bạn" khi không phải vậy - giải pháp của tôi sạch hơn và rõ ràng hơn.
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"))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.