【问题标题】:Compare a Datatable and string array in c#在 C# 中比较数据表和字符串数组
【发布时间】:2014-02-27 01:37:11
【问题描述】:

我只是想将名为“name”的数据表的第一个列与数组中的项目进行比较。它们可以是数据表中同名的多行。在比较了数组中的所有项目之后,它应该删除不在数据表中的行。输出结果可以是数据表本身或列表数组(首选这个),但这应该保留数据表中的所有列。可能想使用 linq 查询。

代码:

DataTable dt = new DataTable("TestTable");
dt.Columns.Add(new DataColumn("email",System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("type",System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("card",System.Type.GetType("System.String")));

ArrayList al = new ArrayList();
al.Add("one@mail.com");
al.Add("two@mail.com");
al.Add("nine@mail.com");
al.Add("ten@mail.com");

DataRow r1 = dt.NewRow(); r1["email"] = "one@mail.com"; //addtype+card// dt.Rows.Add(r1);

DataRow r2 = dt.NewRow(); r2["email"] = "one@mail.com"; //addtype+card// dt.Rows.Add(r2); 

DataRow r3 = dt.NewRow(); r3["email"] = "two@mail.com"; //addtype+card// dt.Rows.Add(r3);

DataRow r4 = dt.NewRow(); r4["email"] = "four@mail.com"; //addtype+card// dt.Rows.Add(r4);

DataRow r5 = dt.NewRow(); r5["email"] = "five@mail.com"; //addtype+card// dt.Rows.Add(r5);

所以从上面的行 r4 和 r5 将从数据表中删除。

【问题讨论】:

  • 有什么理由在 2014 年使用 ArrayList 而不是 List<string> 吗?
  • 没有任何特殊原因,只是旧代码

标签: c# arrays linq datatable


【解决方案1】:

试试

var resultTable = dt.AsEnumberable().Where(r => al.Contains(r.Field<string>("email")).Select(r => r).CopyToDataTable();

【讨论】:

    【解决方案2】:

    你可以用你的代码做几件事。

    • 首先使用List&lt;string&gt; 而不是ArrayList (详情请参阅this
    • 第二次将行添加到您的DataTable,目前您正在创建新的 行,但您没有添加它们。

    稍后使用此查询,您可以创建一个新的DataTable,其中包含基于您的电子邮件列表的行。

    DataTable dtNew = dt.AsEnumerable()
                       .Where(r => al.Contains(r.Field<string>("email")))
                       .CopyToDataTable();
    

    所以你的完整代码可能是:

    DataTable dt = new DataTable("TestTable");
    dt.Columns.Add(new DataColumn("email", System.Type.GetType("System.String")));
    dt.Columns.Add(new DataColumn("type", System.Type.GetType("System.String")));
    dt.Columns.Add(new DataColumn("card", System.Type.GetType("System.String")));
    
    List<string> al = new List<string>(); //Use List<string>
    al.Add("one@mail.com");
    al.Add("two@mail.com");
    al.Add("nine@mail.com");
    al.Add("ten@mail.com");
    
    DataRow r1 = dt.NewRow(); r1["email"] = "one@mail.com"; //addtype+card// dt.Rows.Add(r1);
    dt.Rows.Add(r1);
    DataRow r2 = dt.NewRow(); r2["email"] = "one@mail.com"; //addtype+card// dt.Rows.Add(r2); //Add Row to DataTable
    dt.Rows.Add(r2);
    DataRow r3 = dt.NewRow(); r3["email"] = "two@mail.com"; //addtype+card// dt.Rows.Add(r3);
    dt.Rows.Add(r3);
    DataRow r4 = dt.NewRow(); r4["email"] = "four@mail.com"; //addtype+card// dt.Rows.Add(r4);
    dt.Rows.Add(r4);
    DataRow r5 = dt.NewRow(); r5["email"] = "five@mail.com"; //addtype+card// dt.Rows.Add(r5);
    dt.Rows.Add(r5);
    
    DataTable dtNew = dt.AsEnumerable()
                       .Where(r => al.Contains(r.Field<string>("email")))
                       .CopyToDataTable();
    

    【讨论】:

    • Habib 感谢您的回答,我也将其标记为答案。但是我想问你现在你将如何做与上述相反的事情,即我有一个 IEnumerable 的列表并想从中删除不在 dtNew 中的项目?谢谢
    • @user2906420,如果我正确理解了您的新问题,那么您只需像Where(r =&gt; !al.Contains(r.Field&lt;string&gt;("email"))) 那样反转条件。注意! 之前的al.Contains
    • Habib 但这次我希望输出像这样在 IEnumerable 列表中,我尝试了这个但不起作用:mlist = mlist.Where(r => !dtNew.Contains(r.Name ));
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多