我有一个独特ID的数组列表
ex 1,2,3,4....
以及包含上述ID的记录的DataTable
ID Name
1 abc
2 xxx
3 aaa
4 bbb
5 eee
6 fff
我需要按照数组列表内容过滤数据表
ex: if array list contain 1,2
那么DataTable应该只被过滤以包含那两个记录。除了在For循环中运行DataTable并获取每个DataRow之外,DataTable上还有任何选项吗?
答案 0 :(得分:3)
您可以使用Linq过滤并可能创建新的DataTable。
var filtered =
table.AsEnumerable()
.Where(r => list.Contains(r.Field<int>("ID")))
.CopyToDataTable();
给定包含{1,2}的列表,过滤后的表格将包含行{{1,“abc”},{2,“xxx”}}
附注:虽然您可以使用ArrayLists,但最好在.NET编写的新代码中使用通用对应System.Collections.Generic.List<T>
。泛型是作为.NET 2.0 / C#2.0 / VB 8 / Visual Studio 2005的一部分引入的。目前市场上的版本是.NET 4.0 / C#4.0 / VB 10 / Visual Studio 2010.ArrayLists实际上是过时的,除了在支持源自早期版本的语言和框架的代码。
此外,如果列表特别大,可能需要先在查询之前将其加载到HashSet<T>
,因为在使用Contains方法时它会更高效。
完整的工作代码演示:
var table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("Name", typeof(string));
table.Rows.Add(1, "abc");
table.Rows.Add(2, "xxx");
table.Rows.Add(3, "aaa");
table.Rows.Add(4, "bbb");
table.Rows.Add(5, "eee");
table.Rows.Add(6, "fff");
// var list = new ArrayList(); // do not prefer
var list = new List<int>();
list.Add(1);
list.Add(2);
var filtered =
table.AsEnumerable()
.Where(r => list.Contains(r.Field<int>("ID")))
.CopyToDataTable();