2009-11-09 23 views
6

Ich habe eine Liste von Objekten, die ich an eine ListView binden möchte. Ich sortiere nach zwei Eigenschaften. Das Problem besteht darin, dass einige Datensätze möglicherweise keine der Eigenschaften haben. Dies verursacht einen Fehler. Ich möchte, dass es immer noch die Datensätze bindet, die die Eigenschaft haben.Überprüfen Sie, ob die Eigenschaft in Lambda-Ausdruck null ist

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

Möchten Sie, dass Datensätze die Eigenschaft am Anfang oder am Ende der sortierten Liste nicht enthalten? – outis

Antwort

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()); 

Oder statt! = Null, nutzen alle Test der Eigenschaften Sammlung.

0

Sie können einen ternären Ausdruck in dem Lambda verwenden:

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

Ich sollte beachten, sobald die Lambdas beginnen, so lange zu bekommen, ist es trotzdem eine gute Idee, sie als Funktionen zu deklarieren, um den Code aufzuräumen. – Serguei

0

Ein weiterer gemeinsamer Ansatz sind der Sammlung einen geeigneten Standardwert zu geben, und zurückzugeben, wenn die Sammlung einen bestimmten Schlüssel nicht hat. Zum Beispiel, wenn Properties implementiert 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

Ich habe festgestellt, dass die ?? Operator funktioniert gut. Ich benutze Parenthesis für null zu bewerten,

Beispiel:

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

Dieselbe Logik funktioniert in Lambda, nur Klammer verwenden, um sicherzustellen, dass die richtigen Vergleiche verwendet werden.

Verwandte Themen