2008-10-23 13 views
73

Tôi đã nhìn thấy một đoạn mã ngày hôm qua ở một trong các câu trả lời ở đây trên StackOverflow đã thu hút tôi. Đó là một cái gì đó như thế này:Làm thế nào để chuyển đổi tất cả các chuỗi trong Danh sách <string> xuống chữ thường bằng LINQ?

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

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

Tôi đã hy vọng tôi 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 này, vỏ trong myList là không thay đổi. Vì vậy, câu hỏi của tôi là liệu có một cách, sử dụng LINQ và Lambda biểu thức để dễ dàng lặp qua và sửa đổi nội dung của một danh sách theo cách tương tự như thế này.

Cảm ơn, Max

Trả lời

131

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

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

Không quá nhiều khác biệt so với mã ví dụ của bạn. ForEach lặp lại danh sách gốc trong khi ConvertAll tạo một danh sách mới mà bạn cần gán lại.

+4

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

+0

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

+0

Và chuỗi là bất biến: P – Sherlock

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

Đó là bởi vì ToLower lợi nhuận một chuỗi chữ thường chứ không phải là 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 phương pháp này tốt hơn so với câu trả lời chấp nhận vì bạn có thể sử dụng điều này với bất kỳ IEnumerable , không chỉ Danh sách . –

+5

Giải pháp này cũng hoạt động trong .NET Core, ConvertAll không tồn tại trong .NET Core. –

3

ForEach sử dụng Action<T>, có nghĩa là bạn có thể ảnh hưởng đến x nếu nó không được thay đổi. Kể từ x là một string, nó là bất biến, vì vậy không có gì bạn làm 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ả lại giá trị thay thế.

+0

Xin hãy nghiên cứu thêm nếu bạn không chắc ... nhớ gì không? –

+0

Lỗi là con người, liên kết mà tôi cung cấp có 3,5 in đậm và 2,0 bình thường, tôi chưa thấy. Tôi đã xóa bài viết của tôi ... một bình luận đơn giản từ bạn sẽ là đủ. Bạn muốn downvote không có lý do, hơn bây giờ giả định. –

+0

Mặc dù tôi viết gần một năm sau, và mặc dù tôi không phải 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 - giải pháp của tôi là sạch hơn và rõ ràng hơn. –

-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")) 
Các vấn đề liên quan