我有两个数据表,我有一个过滤匹配记录的功能。以下是我的功能:
public static DataTable FilterCandidates(DataTable FullCandidateData, DataTable RequiredCandidateIDs)
{
DataTable ReqCandidateData = new DataTable();
try
{
var MacthingIDs = FullCandidateData.AsEnumerable().Select(r => r.Field<string>("Candidate_ID")).Intersect(RequiredCandidateIDs.AsEnumerable().Select(r => r.Field<string>("Candidate_ID")));
ReqCandidateData = (from row in FullCandidateData.AsEnumerable()
join Candidate_ID in MacthingIDs
on row.Field<string>("Candidate_ID") equals Candidate_ID
select row).CopyToDataTable();
return ReqCandidateData;
}
catch (Exception ex)
{
ReqCandidateData = FullCandidateData.Clone();
return ReqCandidateData;
}
}
是否有任何其他有效的方法来执行此操作,不知何故,我不愿意假设异常等同于没有匹配的记录。我也可以通过查找长度来做到这一点,但它会大大增加循环次数,我的第一个数据表中有大约 90,000 个候选人,而且它还在不断增长。
如果我有多个列比较,如 Candidate_ID 和 Job_ID,请告诉我如何执行此操作
最佳答案
您可以使用单个连接来达到您的目的。下面的第一个函数只匹配 Candidate_ID,第二个函数同时匹配 Candidate 和 job id。引用第三种方法,从“FullCandidateData”中获取所有与“RequiredCandidateIDs”不匹配的行
public static System.Data.DataTable FilterCandidates(System.Data.DataTable FullCandidateData, System.Data.DataTable RequiredCandidateIDs)
{
System.Data.DataTable reqCandidateData = new System.Data.DataTable();
try
{
var reqCandidateDt = (from candidateRow in FullCandidateData.AsEnumerable()
join reqCandidateRow in RequiredCandidateIDs.AsEnumerable()
on candidateRow["Candidate_ID"].ToString() equals reqCandidateRow["Candidate_ID"].ToString()
select candidateRow);
if (reqCandidateDt.Count() > 0)
{
reqCandidateData = reqCandidateDt.CopyToDataTable();
}
}
catch (Exception ex)
{
}
return reqCandidateData;
}
public static System.Data.DataTable FilterCandidates(System.Data.DataTable FullCandidateData, System.Data.DataTable RequiredCandidateIDs)
{
System.Data.DataTable reqCandidateData = new System.Data.DataTable();
try
{
var reqCandidateDt = (from candidateRow in FullCandidateData.AsEnumerable()
join reqCandidateRow in RequiredCandidateIDs.AsEnumerable()
on
new { CandidateId = candidateRow["Candidate_ID"].ToString(), Job_Id = candidateRow["Job_ID"].ToString() }
equals
new { CandidateId = reqCandidateRow["Candidate_ID"].ToString(), Job_Id = reqCandidateRow["Job_Id"].ToString() }
select candidateRow);
if (reqCandidateDt.Count() > 0)
{
reqCandidateData = reqCandidateDt.CopyToDataTable();
}
}
catch (Exception ex)
{
}
return reqCandidateData;
}
public static System.Data.DataTable FilterCandidates(System.Data.DataTable FullCandidateData, System.Data.DataTable RequiredCandidateIDs)
{
System.Data.DataTable reqCandidateData = new System.Data.DataTable();
try
{
var reqCandIds = RequiredCandidateIDs.AsEnumerable().Select(reqCandidateRow => reqCandidateRow["Candidate_ID"].ToString());
var reqCandidateDt = (from candidateRow in FullCandidateData.AsEnumerable()
where !reqCandIds.Contains(candidateRow["Candidate_ID"].ToString())
select candidateRow);
if (reqCandidateDt.Count() > 0)
{
reqCandidateData = reqCandidateDt.CopyToDataTable();
}
}
catch (Exception ex)
{
}
return reqCandidateData;
}
关于c# - 在 C# 中有效地过滤一个 DataTable 匹配另一个 DataTable 的多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49526067/