2010-06-18 33 views
78

Có phương pháp mặc định nào được định nghĩa trong .Net cho C# để xóa tất cả các phần tử trong danh sách là null không?Làm thế nào để loại bỏ tất cả các phần tử null bên trong một danh sách chung trong một lần?

List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 

Giả sử một số tham số là null; Tôi không thể biết trước và tôi muốn xóa chúng khỏi danh sách của tôi để nó chỉ chứa các tham số không phải là rỗng.

Trả lời

160

Có thể bạn sẽ muốn như sau.

List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 
parameterList.RemoveAll(item => item == null); 
+1

Yep, điều này cũng giống như câu trả lời của tôi, nhưng bằng cách sử dụng mới hơn C# 3 cú pháp lambda. –

+0

@Mark: Tôi thấy số giây đã đăng và người đàn ông đã ở gần (32, 33 và 34). ;) – Lance

+0

Ha :) Vâng, chơi công bằng - câu trả lời của bạn đã sử dụng cú pháp lặp nên +1 –

21

Phương pháp RemoveAll nên làm các trick:

parameterList.RemoveAll(delegate (object o) { return o == null; }); 
+0

Tại sao không sử dụng lambda? –

+8

Đây là câu trả lời bốn tuổi. Tại thời điểm C# 3 là tương đối mới, và tôi vẫn đang sử dụng C# 2 hàng ngày. Cú pháp lambda bây giờ là con đường để đi; Tuy nhiên, đây vẫn là một câu trả lời làm việc, vì vậy tôi đã để nó ở đây cho bất cứ ai không thể sử dụng cú pháp mới hơn (vì bất kỳ lý do gì). –

+2

Tôi không biết rằng cú pháp lambda đến sau. Cảm ơn bạn đã giải thích của bạn! Không nghi ngờ gì, nó là hợp lệ. –

28

Tôi không biết về bất kỳ phương pháp trong xây dựng, nhưng bạn chỉ có thể sử dụng LINQ:

parameterList = parameterList.Where(x => x != null).ToList(); 
+2

Điều này nên tránh nếu 'parameterList' đã là một Danh sách, vì nó sẽ tạo ra một bản sao mới một cách không cần thiết. Trong trường hợp đó, hãy sử dụng phương thức 'RemoveAll' khi người khác đề xuất. – Nick

+0

Đây có lẽ là lựa chọn tốt nhất nếu bộ sưu tập là một 'Mảng'. – Andrew

3
List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 

parameterList = parameterList.Where(param => param != null).ToList(); 
2

Phương thức OfType() sẽ bỏ qua các giá trị null:

List<EmailParameterClass> parameterList = 
    new List<EmailParameterClass>{param1, param2, param3...}; 

IList<EmailParameterClass> parameterList_notnull = 
    parameterList.OfType<EmailParameterClass>(); 
+0

Theo cách này, đây là một cách tiếp cận tốt, nhưng nó gây bất ngờ cho nhà phát triển, người chỉ nghĩ rằng 'OfType' chọn đối tượng của một kiểu nhất định, không nghĩ rằng nó sẽ không bao gồm các giá trị' null' ... Vì vậy, tôi ' m một chút mệt mỏi để giới thiệu điều này vào mã của riêng tôi. –

+0

@ BjörnAliGöransson Đồng ý. Đó là một giải pháp thú vị, nhưng nó không "đọc" rất rõ ràng. Sử dụng .Xóa Tất cả với một lambda vẫn giữ tất cả mọi thứ trên một dòng duy nhất trong khi làm cho nó thực sự rõ ràng như những gì các nhà phát triển đã viết nó đã cố gắng để đạt được. Tuy nhiên, điều này có thể hữu ích nếu có một lợi ích tốc độ đáng giá. – MattD

1

dễ dàng và không có LINQ:

while (parameterList.Remove(null)) {}; 
+0

Phương thức đó nằm trong lớp 'List' ngay bên cạnh' RemoveAll', vì vậy tôi khuyên bạn nên sử dụng phương thức đó để làm rõ. Nếu hiệu suất xảy ra là rất quan trọng, sau đó bạn có thể đi với phương pháp này (mặc dù tôi muốn loại bỏ các dấu ngoặc và có lẽ thêm một bình luận cho các nhà phát triển không biết). – Andrew

+0

@Andrew: theo MSDN, RemoveAll không có giá trị rỗng. Tôi nghĩ tôi cũng đã thử nghiệm điều đó. Một bình luận có ý nghĩa mặc dù. –

+0

'RemoveAll' nhận được' Predicate', vì vậy bạn nên sử dụng 'RemoveAll (x => x == null)', như đã thấy trong câu trả lời được chấp nhận và Mark Bell. – Andrew

Các vấn đề liên quan