Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LinQ相交的Excel数据_C#_Linq - Fatal编程技术网

C# 使用LinQ相交的Excel数据

C# 使用LinQ相交的Excel数据,c#,linq,C#,Linq,我在林克的交集似乎不起作用。我有两张excel表格。我使用LinQToExcel获取它,LinQToExcel不支持VisitSubQueryExpression,我必须做一些额外的工作 板的计数始终返回0。但是当我迭代sourceTest和targetSet的字段值时,我看到了公共字段值。我认为一个简单的方法是实现IEqualityComparer。如果CircuitSet的键是ID,那么您可以这样做: public class CircuitSetComparer : IEqualityCo

我在林克的交集似乎不起作用。我有两张excel表格。我使用LinQToExcel获取它,LinQToExcel不支持VisitSubQueryExpression,我必须做一些额外的工作


板的计数始终返回0。但是当我迭代sourceTest和targetSet的字段值时,我看到了公共字段值。

我认为一个简单的方法是实现IEqualityComparer。如果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
}
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();
然后在代码中:

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

虽然GetHashCode方法很棘手,但如果我的假设ID是键是正确的,那就没问题了。

这些都是引用类型的实例。Intersect对引用类型使用DefaultComparer,即ReferenceEquals。由于sourceTest没有targetTest的公共实例,因此未找到任何结果

您可以创建一个比较器,也可以这样连接:

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

但我根据david的建议更改了查询

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

您是否尝试过实现自定义IEqualityComparer?没有。我认为找到公用行集的唯一方法是使用Intersect。源和目标之间有多个公用行。我通过分别编写源板和目标板的单个列表的值来检查它。谢谢Francisco,我会尝试一下,如果成功与否,我会公布结果。