2014-03-04 75 views
3

我正在編寫一個簡單的控制檯應用程序,用於比較自定義類對象的兩個實例。對於每個屬性,我將True或False寫入控制檯窗口以顯示每個對象的屬性是否匹配。使用LINQ SequenceEqual擴展方法偶爾出現空屬性

某些屬性(如ProductLines(List屬性))可能在一個或兩個對象中爲空......或者都不爲空。由於它不接受空值,因此使用SequenceEqual會出現小問題。 是否有比我寫的代碼更好的比較兩個序列屬性的方法?

// test if either collection property is null. 
if (commsA.Last().ProductLines == null || commsB.Last().ProductLines == null) 
{ 
    // if both null, return true. 
    if (commsA.Last().ProductLines == null && commsB.Last().ProductLines == null) 
    { 
     Console.WriteLine("Property Match:{0}", true); 
    } 
    // else return false. 
    else 
    { 
     Console.WriteLine("Property Match:{0}", false); 
    } 
} 
// neither property is null. compare values and return boolean. 
else 
{ 
    Console.WriteLine("Property Match:{0}", 
      commsA.Last().ProductLines.SequenceEqual(commsB.Last().ProductLines)); 
} 
+0

備註 - 每次你寫'commsA.Last()'或'commsB.Last()'執行查詢。即使使用Linq to Objects,也需要創建枚舉器,並執行Last() –

+0

緩存兩個序列的「Last()」結果。否則,您每次都有風險重複它。至少它花費你的資源,而你可以花費0代替。 – abatishchev

+2

SequenceEqual *不接受空值...是什麼讓你認爲它沒有? (我剛剛用一個字符串數組對它進行了測試,它很好。) –

回答

5

我可能會添加NullRespectingSequenceEqual擴展方法:

public static class MoreEnumerable 
{ 
    public static bool NullRespectingSequenceEqual<T>(
     this IEnumerable<T> first, IEnumerable<T> second) 
    { 
     if (first == null && second == null) 
     { 
      return true; 
     } 
     if (first == null || second == null) 
     { 
      return false; 
     } 
     return first.SequenceEqual(second); 
    } 
} 

,或者使用堆疊條件運算符:

public static class MoreEnumerable 
{ 
    public static bool NullRespectingSequenceEqual<T>(
     this IEnumerable<T> first, IEnumerable<T> second) 
    { 
     return first == null && second == null ? true 
      : first == null || second == null ? false 
      : first.SequenceEqual(second); 
    } 
} 

然後,你可以使用:

Console.WriteLine("Property Match: {0}", 
    x.ProductLines.NullRespectingSequenceEqual(y.ProductLines)); 

您可以重複使用擴展方法,無論你想,就好像它是一個正常的(你是否應該叫Last略微分開經營。) LINQ到對象的一部分。 (當然,它不適用於LINQ to SQL等。)

+0

偉大的答案,喬恩。我認爲你的擴展方法最適合我的應用程序。 –

5

你肯定有Property Match結果顯示重複。只顯示一次結果。移動計算單獨的方法:

Console.WriteLine("Property Match:{0}", 
    IsMatch(commsA.Last().ProductLines, commsB.Last().ProductLines)); 

像這樣:

public bool IsMatch<T>(IEnumerable<T> a, IEnumerable<T> b) 
{ 
    if (a != null && b != null) 
     return a.SequenceEqual(b); 

    return (a == null && b == null); 
} 
+1

謝謝,謝爾蓋! –

+1

@DavidAlanCondit當然,你可以使這種方法作爲擴展,特別是如果你需要經常使用它 –