首页 > 解决方案 > 将 DataTable 中的 2 列与 List 中的 2 列进行比较,并根据特定条件构建一个新 List

问题描述

我有DataTable

public static DataTable SubProjects = new DataTable();

public static DataTable GetSubProjects
{
    get { return SubProjects; }
}

它来自数据库,所以列如下

select ProjectN,ProjectSubN,ProjectM

并列出:

public class SubProjectsList
{
    public string ProjectNumber { get; set; }
    public string SubProjectNumber { get; set; }
    public string SubProjectName { get; set; }
    public string ProjectManager { get; set; }
    public int ObjectID { get; set; }

    public SubProjectsList(string ProjectNumber, string SubProjectNumber, string SubProjectName, string ProjectManager, int ObjectID)
    {
        this.ProjectNumber = ProjectNumber;
        this.SubProjectNumber = SubProjectNumber;
        this.SubProjectName = SubProjectName;
        this.ProjectManager = ProjectManager;
        this.SubProjectNumber = SubProjectNumber;
        this.ObjectID = ObjectID;
    }
}

public static List<SubProjectsList> DeliverySubProjectList = new List<SubProjectsList>();

最终我想把所有结果都放到新的列表中

ProjectN + ProjectSubN (DataTable) = ProjectNumber + SubProjectNumber (List) && 
ProjectM (DataTable) != ProjectManager (List)

作为输出,我需要得到ProjectNumber, SubProjectNumber, ProjectM, ProjectManager. 基本上我需要赶上ProjectMProjectManager这与一个子项目不匹配。我可以这样做

var SubProjectResult = SubProjects.AsEnumerable()
    .Where(x => DeliverySubProjectList.Any(y => 
    y.ProjectNumber.Trim() + y.SubProjectNumber == x.Field<string>("ProjectN").Trim() + x.Field<string>("ProjectSubN").Trim() &&
    !string.Equals(y.ProjectManager.Trim(), x.Field<string>("ProjectM").Trim(), StringComparison.CurrentCultureIgnoreCase)))
    .Select(x => new
    {
        ProjectN = x.Field<string>("ProjectN"),
        ProjectN = x.Field<string>("ProjectSubN"),
        ProjectM = x.Field<string>("ProjectM"),
        ProjectM = x.ProjectManager // This is not possible
    })
    .OrderBy(o => o.ProjectN).ToList();

ProjectM = x.ProjectManager // This is not possible

是错误的,无法编译。所以我无法从匹配但 ProjectManager 不匹配ProjectManager的列表中获取。ProjectN + ProjectSubN (DataTable) = ProjectNumber + SubProjectNumber (List)我需要先将 DataTable 和 List 合并在一起吗?我试过这个

var myList1 = SubProjects.AsEnumerable().Concat(DeliverySubProjectList).ToList();

但收到错误

严重性代码描述项目文件行抑制状态错误 CS1929“EnumerableRowCollection”不包含“Concat”的定义,并且最佳扩展方法重载“Queryable.Concat(IQueryable, IEnumerable)”需要“IQueryable”类型的接收器

标签: c#linq

解决方案


我认为这应该给你你正在寻找的东西。您可能需要添加额外的空检查,我也不太确定您希望如何从列表和数据表中添加字符串值:

public class ResultModel
        {
            public string ProjectNumber { get; set; }
            public string SubProjectNumber { get; set; }
            public string ProjectM { get; set; }
            public string ProjectManager { get; set; }
        }

...
...
static void Main(string[] args)
        {
            List<SubProjectsList> DeliverySubProjectList = // populate list
            DataTable SubProjects = // populate datatable
            List<ResultModel> results = GetResults(DeliverySubProjectList, SubProjects).ToList();
        }

        private static IEnumerable<ResultModel> GetResults(List<SubProjectsList> DeliverySubProjectList, DataTable SubProjects)
        {
            return SubProjects.AsEnumerable().Select(row =>
            {
                var listItem = DeliverySubProjectList.FirstOrDefault(item =>
                {
                    return item.ProjectNumber + item.SubProjectNumber == row["ProjectN"].ToString() + row["ProjectSubN "].ToString()
                        && !item.ProjectManager.Equals(row["ProjectM"].ToString());

                });

                if (listItem != null)
                {
                    return new ResultModel
                    {
                        ProjectNumber = row["ProjectN"].ToString(),
                        SubProjectNumber = listItem.SubProjectNumber,
                        ProjectM = row["ProjectM"].ToString(),
                        ProjectManager = listItem.ProjectManager
                    };
                }
                else
                {
                    return null;
                }
            })
            .Where(res => res != null);
        }

推荐阅读