我有一个清单。我想过滤表格列表中的所有行,以查找列表中每个数据表中的所有行。
如果可能,比较需要在每行的“ID”列上。
我试图用Linq解决这个问题但是卡住了。这就是我到目前为止所做的:
List<DataTable> dataTables = new List<DataTable>();
// fill up the list
List<DataRow> dataRows =
dataTables.SelectMany(dt => dt.Rows.Cast<DataRow>().AsEnumerable()).
Aggregate((r1, r2) => r1.Intersect(r2));
有什么建议吗?
答案 0 :(得分:4)
不是一个简单的问题。这是一个解决方案(对我来说似乎太复杂了,但它确实有效)。
要在DataTable上使用Linq,请参阅this article作为开始。
您可以从这样的一个表中获取ID
var ids = dt.AsEnumerable().Select (d => d.Field<int>("ID")).OfType<int>();
并从多个表
var setsOfIds = dataTables.Select (
t => t.AsEnumerable().Select (x => x.Field<int>("ID")).OfType<int>());
要交叉多个列表,请尝试this article。使用其中一种方法,您可以获得所有ID的交集。
使用Jon Skeet的辅助方法
public static class MyExtensions
{
public static List<T> IntersectAll<T>(this IEnumerable<IEnumerable<T>> lists)
{
HashSet<T> hashSet = new HashSet<T>(lists.First());
foreach (var list in lists.Skip(1))
{
hashSet.IntersectWith(list);
}
return hashSet.ToList();
}
}
我们可以写
var commonIds = setsOfIds.InsersectAll();
现在展平DataTables中的所有行并按公共ID过滤:
var rows = dataTables.SelectMany (t => t.AsEnumerable()).Where(
r => commonIds.Contains(r.Field<int>("ID")));
现在按ID分组并获取每一行的第一个实例:
var result = rows.GroupBy (r => r.Field<int>("ID")).Select (r => r.First ());
答案 1 :(得分:1)
尝试这样找到两个列表之间的交集:
r1.Join(r2, r1 => r1.Id, r2 => r2.Id, (r1, r2) => r1);