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