所以你有一个列表和一个数据表。您不打算使用数据表的值,只使用代码。
您想保留那些列表项,它们的代码也是 DataTable 中的代码。
如果您打算将 DataTable 用于解决此问题以外的其他事情,我的建议是首先创建一个过程,将您的 DataTable 转换为可枚举的序列。
这样你可以添加 LINQ 语句,不仅针对这个问题,还针对其他问题。
让我们为您的 DataTable 创建一个扩展方法,将数据转换为 DataTable 中的项目。见extension methods demystified.
唉,我不知道你的 DataTable 里有什么,假设你的 DataTable 包含 Orders
class CustomerOrder
{
public int Id {get; set;}
public int CustomerId {get; set;}
public int Code {get; set;}
public string Value {get; set;}
...
}
扩展类DataTable功能的扩展方法:
public static IEnumerable<Order> ToCustomerOrders(this DataTable table)
{
return table.AsEnumerable().Select(row => new CustomerOrder
{
Id = ...
CustomerId = ...
Code = ...
Value = ...
};
}
我对 DataTables 不是很熟悉,但你知道如何将行中的单元格转换为正确的值。
用法:
DataTable table = ...
Int customerId = 14;
var ordersOfThisCustomer = table.ToCustomerOrders
.Where(customerOrder => customerOrder.CustomerId == customerId)
.FirstOrDefault();
换句话说:将数据表逐行转换为 CustomerOrders,并检查每个转换后的 CustomerOrder 是否具有等于 14 的 CustomerId。如果找到则停止。如果没有这样的行,则返回 null。
现在您已经有了一个很好的可重复使用的过程,而且易于测试、调试和更改,我们可以回答您的问题。
给定一个包含 CustomerOrders 的 DataTable,以及一个包含 Code 和 Name 的项目序列,只保留序列中的那些项目,这些项目的代码也是 DataTable 中的代码。
var dataTable = ... // your DataTable, filled with CustomerOrders.
var codeNames = ... // your list with Codes and Names
var codesInDataTable = dataTable.ToCustomerOrders
.Select(customerOrder => customerOrder.Code)
.Distinct();
这将创建一个可枚举序列,该序列将逐行转换您的 DataTable 并提取属性代码。重复的代码值将被删除。
如果代码是唯一的,则不需要 Distinct。
注意:可枚举序列尚未枚举!
var result = codeNames
.Where(codeName => codesInDataTable.Contains(codeName.Code))
.ToList();
简而言之:对于列表中的每个 [Code, Name] 组合,只保留那些 Code 的值也在 codesInDataTable 中的 [Code, Name] 组合。