2012-12-17 110 views
-1

我有一個如下所示的查詢。任何人都知道爲什麼?:部件總是返回錯誤的值,儘管在LIST中有項目包含。或者任何人有更好的想法寫這個查詢,請隨時在這裏回覆。謝謝。LinQ:?:選擇查詢中的運算符

List EList = new List(); 
EList.Add(new EmployeeInfo(1, "a1", "b1")); 
EList.Add(new EmployeeInfo(2, "a2", "b2")); 
List OList = new List(); 
OList.Add(new EmployeeInfo(1, "a1", "b1")); 
OList.Add(new EmployeeInfo(2, "a2", "b2")); 
OList.Add(new EmployeeInfo(3, "aa2", "bb2")); 

var results = (
    from e in b 
    select new 
    { 
     Id = e.ID, 
     Name = e.Name, 
     Email = e.Email, 
     IS_Elist = (EList.Contains(e))?true:false, 
     IS_Olist = (OList.Contains(e)) ? true : false, 
    } 
    ).ToList(); 
+4

等等,什麼? '?true:false'是完全多餘的。只要說'IS_Elist = Elist.Contains(e),IS_Olist = Olist.Contains(e)'。 –

+1

'b'從哪裏來? –

回答

2

首先,你可以簡化您的查詢 - expression ? : true : false僅相當於expression,我們得到以下幾點。

var results = b.Select(e => new 
          { 
           Id = e.ID, 
           Name = e.Name, 
           Email = e.Email, 
           IS_Elist = EList.Contains(e), 
           IS_Olist = OList.Contains(e) 
          }) 
       .ToList(); 

這應該,如果從b的項目包含在EListOList肯定會產生true。如果您總是得到false,這意味着EListOList不包含任何來自b的項目。請記住,您可能正在做參考比較,因此

new EmployeeInfo(1, "a", "b") == new EmployeeInfo(1, "a", "b") 

通常會產生false

我猜你實際上打算通過ID進行比較。

var results = b.Select(e => new 
          { 
           Id = e.ID, 
           Name = e.Name, 
           Email = e.Email, 
           IS_Elist = EList.Any(x => x.ID == e.ID), 
           IS_Olist = OList.Any(x => x.ID == e.ID) 
          }) 
       .ToList(); 

的替代解決方案是在EmployeeInfo或壓倒一切Equals(), GetHashCode() and the equality operator實施IEquatable<T>。您應該注意,您的所有實現都會產生一致的結果,否則您將以很多困惑結束,例如爲什麼例如Object.Equals()和等於運算符會產生不同的結果。

0

您的平等檢查可能不像您對EmployeeInfo期望的那樣。要確認,在上面發佈的代碼片段的底部,請嘗試此操作,看看它是否返回true。

var is_olist = OList.Contains(new EmployeeInfo(1, "a1", "b1")); 

如果返回錯誤,你需要考慮使用更簡單的東西,但仍然是獨一無二的比較實例(如ID件),否則實施等於自己EmployeeInfo。