【问题标题】:Filter DataTable using ArrayList使用 ArrayList 过滤数据表
【发布时间】:2012-02-10 03:00:28
【问题描述】:

我有一个唯一 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 Loop 中运行 DataTable 并获取每个 DataRow 之外,DataTable 上是否有任何选项可以执行此操作?

【问题讨论】:

    标签: asp.net filter datatable arraylist


    【解决方案1】:

    您可以使用 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&lt;T&gt;。泛型是作为 .NET 2.0 / C# 2.0 / VB 8 / Visual Studio 2005 的一部分引入的。目前市场上的版本是 .NET 4.0 / C# 4.0 / VB 10 / Visual Studio 2010。ArrayLists 实际上已经过时,除非支持源自早期版本的语言和框架的代码。

    另外,如果列表特别大,可能值得在查询之前先将其加载到HashSet&lt;T&gt;,因为使用 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();
    

    【讨论】:

    • 我遇到了异常 -“源不包含 DataRows。”但 DataTable 仍然具有 ArrayList 中的 ID
    • 只有当源表没有行它们都没有通过where中的谓词时才会发生该错误。因此,您的原始表要么是空的,要么与列表中的值不匹配。您将不得不调试以验证。我发布了完整的 sn-p 代码来演示工作行为。
    • 正如你提到的,我开始使用 List 现在它正在工作。根据上述过滤方法,DataTable 过滤代码需要 list.thanx 上的整数项以获得帮助..
    猜你喜欢
    • 2020-02-14
    • 2019-03-18
    • 2013-12-13
    • 1970-01-01
    • 2018-09-11
    • 2013-10-25
    • 1970-01-01
    相关资源
    最近更新 更多