2010-07-23 54 views
0

我在LINQ中相交不知何故似乎工作。我有兩張excel表格。我使用LinQToExcel獲取它並(LinQToExcel不支持VisitSubQueryExpression我不得不做一些額外的工作)。Excel數據使用LinQ相交

List<BoardSheet> sourceTest = (from t in Boards[0] 
         where t["Board"] == boardName 
         select new CircuitSet 
          { 
           ID = string.Format(t["ID"]), 
           Data = string.Format(t["Data"]), 
           CtrlType = string.Format(t["CtrlType"]), 
           sys = string.Format(t["sys"]), 
           code = string.Format(t["code"]) 
          } 
         ).ToList<BoardSheet>(); 

      List<BoardSheet> targetTest = (from t in Boards[0] 
              where t["Board"] == boardName 
              select new CircuitSet 
              { 
               ID = string.Format(t["ID"]), 
               Data = string.Format(t["Data"]), 
               CtrlType = string.Format(t["CtrlType"]), 
               sys = string.Format(t["sys"]), 
               code = string.Format(t["code"]) 
              } 
         ).ToList<BoardSheet>(); 

      IEnumerable<BoardSheet> board = sourceTest.Intersect(targetTest); 

板的計數總是返回0.但是,當我迭代sourceTest和targetSet的字段值時,我會看到公共字段值。

+0

您是否嘗試過實施定製的IEqualityComparer ? – Francisco 2010-07-23 16:56:57

+0

沒有Francisco.I認爲找到常見的一組行的唯一方法是使用「相交」。 – Webbies 2010-07-23 17:25:07

+0

在源代碼和目標代碼之間有許多共同的行。我通過分別寫入單獨的源代碼和目標代碼列表的值來檢查它。 – Webbies 2010-07-23 17:27:24

回答

0

這些是參考類型的實例。 Intersect使用DefaultComparer作爲引用類型,即ReferenceEquals。由於sourceTest與targetTest沒有共同的實例,因此沒有找到結果。

您可以創建一個的Comparer,或者你可以加入這樣的:

List<CircuitSet> results = 
(
    from s in sourceTest 
    join t in targetTest 
    on s.Id equals t.Id 
    where s.Data == t.Data && s.ControlType == t.ControlType ... 
    select s 
).ToList(); 
+0

謝謝大衛,你的代碼工作。 – Webbies 2010-07-24 06:30:20

0

我認爲一個簡單的方法是實施IEqualityComparer<CircuitSet>。如果CircuitSet的關鍵是ID,那麼你可以做這樣的:

public class CircuitSetComparer : IEqualityComparer<CircuitSet> 
{ 

    #region IEqualityComparer<CircuitSet> Members 

    public bool Equals(CircuitSet x, CircuitSet y) 
    { 
     return x.ID == y.ID; 
    } 

    public int GetHashCode(CircuitSet obj) 
    { 
     return obj.ID;    
    } 

    #endregion 
} 

然後在你的代碼:

IEnumerable<BoardSheet> board = sourceTest.Intersect(targetTest, new CircuitSetComparer()); 

的GetHashCode方法是棘手的,雖然,但它應該是正常的,如果我的假設(ID爲鑰匙)是正確的。

+0

感謝弗朗西斯科,我會嘗試一下,如果它工作或沒有發佈結果。 – Webbies 2010-07-23 18:37:44

0

,但我改變了查詢依據是什麼大衛建議

List<BoardSheet> sourceTest =(from s in (from t in Boards[0] 
             where t["Board"] == boardName 
             select new CircuitSet 
             { 
              ID = string.Format(t["ID"]), 
              Data = string.Format(t["Data"]), 
              CtrlType = string.Format(t["CtrlType"]), 
              sys = string.Format(t["sys"]), 
              code = string.Format(t["code"]) 
             } 
         ).ToList<BoardSheet>() jon tbl in (from t in Boards[0] 
             where t["Board"] == boardName 
             select new CircuitSet 
             { 
              ID = string.Format(t["ID"]), 
              Data = string.Format(t["Data"]), 
              CtrlType = string.Format(t["CtrlType"]), 
              sys = string.Format(t["sys"]), 
              code = string.Format(t["code"]) 
             } 
        ).ToList<BoardSheet>() on s.ID equals tbl.ID select s).ToList<BoardSheet>() ;