2009-11-09 5 views
6

listview에 바인딩하려는 객체 목록이 있습니다. 두 속성으로 정렬됩니다. 일부 레코드에 속성 중 하나가 없을 수있는 문제가 있습니다. 이로 인해 오류가 발생했습니다. 재산이있는 레코드를 여전히 바인딩하고 싶습니다.속성이 람다 식에서 null인지 확인하십시오.

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

정렬 된 목록의 시작 또는 끝에 속성이 누락 된 레코드를 원합니 까? – outis

답변

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

또는 대신! = null의 경우, 속성 컬렉션이 어떤 시험 사용.

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

당신은 람다에 삼항 표현을 사용할 수 있습니다. 예를 들어 Properties이 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()); 
+0

람다가 그렇게 오래 시작하면 어쨌든 코드를 정리하는 함수로 선언하는 것이 좋습니다. – Serguei

0

또 다른 일반적인 접근 방식은 수집에게 적합한 기본값을 제공하는 것입니다, 그리고 컬렉션에 특정 키가없는 경우를 돌려 :

1

연산자가 잘 작동합니다. 나는 예를 들어

, 널 (null)에 대한 평가 괄호를 사용

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

이 같은 논리는 정확한 비교가 사용되도록하기 위해 괄호를 사용, 람다에서 작동합니다.

관련 문제