c# - 将 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
. 基本上我需要赶上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 不匹配ProjectManager
的列表中获取。ProjectN + ProjectSubN (DataTable) = ProjectNumber + SubProjectNumber (List)
我需要先将 DataTable 和 List 合并在一起吗?我试过这个
var myList1 = SubProjects.AsEnumerable().Concat(DeliverySubProjectList).ToList();
但收到错误
严重性代码描述项目文件行抑制状态错误 CS1929“EnumerableRowCollection”不包含“Concat”的定义,并且最佳扩展方法重载“Queryable.Concat(IQueryable, IEnumerable)”需要“IQueryable”类型的接收器
解决方案
我认为这应该给你你正在寻找的东西。您可能需要添加额外的空检查,我也不太确定您希望如何从列表和数据表中添加字符串值:
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);
}
推荐阅读
- artifactory - 如何通过 Rest API 或任何 CLI 命令导出 jfrog 工件存储库?
- python - 在 Linux 64 ARM 上安装 Saxon-C
- azure - 无法使用已安装的 AzureAD 模块执行 Connet-AzureAD
- python - 从 Python 程序制作可执行文件
- appium - 尝试 iOS 本机应用程序时在 Sauce labs 上出现错误:错误:基础设施错误 - Sauce VM 无法启动浏览器或设备
- python - 在 python 中使用 spark 创建新表
- java - Golang OpenAPI 生成器将查询参数包装到一个对象中,而 Java 对应项没有
- go - Go Gorm 模型具有许多未迁移到数据库的关联
- javascript - 如何让 apollo-module 自动重新获取有关查询参数更新的查询
- javascript - 类实例上的嵌套属性