如何解决将DataTable中的2列与List中的2列进行比较,并使用特定条件构建新的列表
我有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
。基本上,我需要捕获与一个子项目不匹配的ProjectM
和ProjectManager
。我本可以这样做
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
匹配的列表中获得ProjectN + ProjectSubN (DataTable) = ProjectNumber + SubProjectNumber (List)
,但ProjectManager不匹配。我需要先将Concat DataTable和List一起使用吗?我已经尝试过了
var myList1 = SubProjects.AsEnumerable().Concat(DeliverySubProjectList).ToList();
但出现错误
严重性代码描述项目文件行抑制状态 错误CS1929“ EnumerableRowCollection”不包含 “ Concat”的定义和最佳扩展方法重载 'Queryable.Concat(IQueryable, IEnumerable)'需要类型的接收器 “可查询”
解决方法
我认为这应该为您提供所需的东西。您可能需要添加额外的空检查,而我也不是很确定要从列表和数据表中添加字符串值的方式:
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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。