【问题标题】:Filter datatable if a column contains any one of the elements in an array如果列包含数组中的任何一个元素,则过滤数据表
【发布时间】:2020-01-30 16:38:46
【问题描述】:

我有一个这样的数据表

ColA  ColB
1     OneThree
2     FourTwo
3     EightNine
4     ThreeEightFive
5     SevenNine

子串在另一个数组("Two","Eight", "Three")

如何使用 ColB 过滤 DataTable 并获取包含数组中任何一个子字符串的行?数组可能有 n 个子字符串。

有没有一种可能的方式使用 Linq 而不循环遍历每个数组元素并使用 CONTAINS 关键字检查 colB?

【问题讨论】:

    标签: c# vb.net linq datatable


    【解决方案1】:

    这将返回包含列表中值的所有 ColB 值。

    var dt = // your datatable
    var list = new List<string>{ "Two", "Eight", "Three" }; 
    var matches = dt.AsEnumerable()
                    .Where(dr => list.Any(l => dr.Field<string>("ColB").Contains(l)))
                    .Select(r => r.Field<string>("ColB"))
                    .ToList();
    

    请注意,Linq 仍然在后台执行循环。这可能不是很有效(由于Where/Any),尤其是在大型数据集上。

    如果您想返回DataTable,请使用CopyToDataTable()

    var matches = dt.AsEnumerable()
                    .Where(dr => list.Any(l => dr.Field<string>("ColB").Contains(l)))
                    .CopyToDataTable();
    

    【讨论】:

      【解决方案2】:

      您可以使用如下所示的LINQ查询数据表

      DataTable dt = new DataTable();
                  dt.Columns.Add("ColA", typeof(int));
                  dt.Columns.Add("ColB", typeof(string));
                  dt.AcceptChanges();
      
                  var r1 = dt.NewRow();
                  r1["ColA"] = 1;
                  r1["ColB"] = "OneThree";
                  dt.Rows.Add(r1);
      
                  var r2 = dt.NewRow();
                  r2["ColA"] = 2;
                  r2["ColB"] = "FourTwo";
                  dt.Rows.Add(r2);
      
                  var r3 = dt.NewRow();
                  r3["ColA"] = 3;
                  r3["ColB"] = "EightNine";
                  dt.Rows.Add(r3);
      
                  var r4 = dt.NewRow();
                  r4["ColA"] = 4;
                  r4["ColB"] = "ThreeEightFive";
                  dt.Rows.Add(r4);
      
                  var r5 = dt.NewRow();
                  r5["ColA"] = 5;
                  r5["ColB"] = "SevenNine";
                  dt.Rows.Add(r5);
      
                  dt.AcceptChanges();
      
                  var subArray = new string[3] { "Two", "Eight", "Three" };
      
                  var query = from r in dt.AsEnumerable()
                              where  subArray.Any(s=> r.Field<string>("ColB").IndexOf(s,StringComparison.InvariantCultureIgnoreCase)>-1)
                              select r.Field<string>("ColB");
                  foreach (var item in query)
                  {
                      Console.WriteLine(item);
                  }
      

      【讨论】:

        【解决方案3】:

        如果我很理解你需要这样的东西。 用您填充的 ​​DataTable 更改 MyDataTable 并根据您的需要处理代码。

        Dim containsMyWords As Func(Of String, Boolean) = Function(entryS As String)
                                                              Dim myWords() As String = {"r1", "r2", "r3", "r4", "r5", "r6"}
                                                              If myWords.Contains(entryS) Then Return True
                                                              Return False
                                                          End Function
        
        Dim listRows = From dtR As DataRow In MyDataTable.AsEnumerable
                       Where containsMyWords(CType(dtR.Item("ColB"), String))
        
        For Each mRow In listRows
            Console.WriteLine(Join(mRow.ItemArray, "~"))
        Next
        

        【讨论】:

          猜你喜欢
          • 2021-07-19
          • 1970-01-01
          • 1970-01-01
          • 2018-05-17
          • 1970-01-01
          • 2017-02-06
          • 2021-02-11
          • 1970-01-01
          • 2022-06-20
          相关资源
          最近更新 更多