2009-11-09 13 views
6

Mam listę obiektów, które próbuję powiązać z listview. Sortuję według dwóch właściwości. Istnieje problem polegający na tym, że niektóre rekordy mogą nie mieć jednej z właściwości. Powoduje to błąd. Chciałbym, żeby nadal wiązało się zapisy, które mają nieruchomość.Sprawdź, czy właściwość ma wartość null w wyrażeniu 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

Czy chcesz, aby rekordy brakujące właściwości znajdowały się na początku lub na końcu posortowanej listy? – outis

Odpowiedz

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

Albo zamiast! = Null, niezależnie od zastosowania testu kolekcja PROPERTIES.

0

Można użyć potrójny wyraz w 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

Powinienem zauważyć, że gdy lambdy zaczną się wydobywać tak długo, dobrym pomysłem jest zadeklarowanie ich jako funkcji do oczyszczenia kodu. – Serguei

0

Innym powszechnym rozwiązaniem jest dać kolekcji odpowiednią wartość domyślną, a powrócić że gdy zbieranie nie mają szczególny klucz. Na przykład, jeśli Properties implementuje 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

Znalazłem, że ?? Operator działa dobrze. Używam nawiasie ocenić na null,

Dla przykładu:

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

Ta sama logika działa w Lambda, wystarczy użyć nawiasów, aby zapewnić poprawne porównania są wykorzystywane.

Powiązane problemy