c# - 在 C# 中有效地过滤一个 DataTable 匹配另一个 DataTable 的多个列

标签 c# asp.net performance linq datatable

我有两个数据表,我有一个过滤匹配记录的功能。以下是我的功能:

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_IDJob_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/

相关文章:

c# - 使用 c# 解析大型 csv 文件中前两列的快速/低内存方法

c# - ASP.NET 向导获取文本框的值

asp.net - 授权与 Active Directory .NET Core 1.1、.Net Framework 的属性交互

asp.net - 从虚拟 URL 播放视频文件

mysql - 查询缓存和缓冲池无法提供帮助,在磁盘上创建了很多表

c - 外部函数调用与静态函数调用的性能

mysql - 如何改进具有多个 JOINS 的 MYSQL 查询

c# - 具有隐藏继承成员的新属性的 XML 序列化类

c# - WPF MVVM 分页

c# - 使用泛型作为异步方法的返回类型