2009-11-09 31 views
6

Tôi có danh sách các đối tượng mà tôi đang cố ràng buộc với chế độ xem danh sách. Tôi sắp xếp theo hai thuộc tính. Vấn đề tồn tại theo đó một số bản ghi có thể không có một trong các thuộc tính. Điều này gây ra lỗi. Tôi muốn nó vẫn còn ràng buộc các hồ sơ có tài sản.Kiểm tra xem thuộc tính có null trong biểu thức lambda

IEnumerable<ERec> list = retailerList.Cast<ERec>(); 
lvwRetailStores.DataSource = list.OrderByDescending(r => r.Properties["RS_Partner Type"].ToString()) 
           .ThenBy(r => r.Properties["RS_Title"].ToString()); 
+0

Bạn có muốn bản ghi thiếu thuộc tính ở đầu hoặc cuối danh sách được sắp xếp không? – outis

Trả lời

7
list.Where(r => r.Properties["RS_Partner_Type"] != null && r.Properties["RS_Title"] != null) 
    .OrderByDescending(r => r.Properties["RS_Partner Type"].ToString()) 
    .ThenBy(r => r.Properties["RS_Title"].ToString()); 

Hoặc thay vì! = Null, sử dụng bất cứ thử nghiệm bộ sưu tập thuộc tính có.

0

Bạn có thể sử dụng một biểu ternary trong lambda:

list.OrderByDescending(r => r.Properties["RS_Partner_Type"] == null ? null : r.Properties["RS_Partner Type"].ToString()) 
    .ThenBy(r => r.Properties["RS_Title"] == null ? null : r.Properties["RS_Title"].ToString()); 
+0

Tôi nên lưu ý, một khi lambdas bắt đầu nhận được rằng nó là một ý tưởng tốt anyway để khai báo chúng như là chức năng để làm sạch mã. – Serguei

0

Một cách tiếp cận phổ biến là cung cấp cho các bộ sưu tập giá trị mặc định phù hợp, và gửi lại rằng khi bộ sưu tập không có chìa khóa riêng. Ví dụ: nếu Properties triển khai IDictionary,

public static class IDictionaryExtension { 
    public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key, TValue default) { 
     TValue result; 
     return dict.TryGetValue(key, out result) ? result : dflt; 
    } 
} 
... 
lvwRetailStores.DataSource = list.OrderByDescending(r => r.GetValue("RS_Partner Type", "").ToString()) 
           .ThenBy(r => r.GetValue("RS_Title","").ToString()); 
1

Tôi đã tìm thấy rằng ?? Toán tử hoạt động tốt. Tôi sử dụng ngoặc để đánh giá cho null,

Ví dụ:

Datetime? Today = DateTimeValue // Check for Null, if Null put Today's date datetime GoodDate = Today ?? DateTime.Now

Logic này cùng làm việc trong Lambda, chỉ cần sử dụng dấu ngoặc đơn để đảm bảo rằng sự so sánh chính xác được sử dụng.

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