为什么我的过滤器不起作用? d.DefaultView.RowFilter = cls;

时间:2019-06-21 16:13:24

标签: c# filter datatable

我只想对我的数据表应用行过滤器,并且行过滤器不起作用,没有错误,只是返回相同的数据表。

我曾尝试从数据表创建一个数据视图以进行应用,但是这也不会返回过滤后的列表。我不知道为什么下面的代码行不通..

DataTable d = processFileData(concatFile);
string cls = String.Format("Column6 NOT IN ({0})", String.Join(",", returnClass()));
d.DefaultView.RowFilter = cls;

上面的cls变量是我尝试使用的int值的列表,如下所示:

Column6 NOT IN (75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,281,303,405,406,493,599,601,606,610,626,630,639,640,647,648,651,662,664,671,672,680,689,697,701,703,706,709,712,717,718,724,735,740,741,743,744,767,768,769,770,775,780,791,799,800,801,802,803,805,806,807,808,810,811,812,815,816,817,818,820,836,837,873,874,875,879,881,895,896,897,902,903,904)

我希望有一组新的记录,并且只包含那些在过滤器中没有该条件的记录。原始DataTable = 34,945条记录,如果我手动在excel中将过滤器应用于excel,则预期结果应为DataTable = 29,240条记录。

以下是我要使用过滤器完成的示例:

原始数据表:

Column1,Column2,Column4,Column5,Column6

你好,今天,食物,娱乐,75

你好,今天,食物,娱乐,75

您好,今天,食物,娱乐,79

您好,今天,食物,娱乐,79

您好,今天,食物,娱乐,79

您好,今天,食物,娱乐,100

您好,今天,美食,娱乐,101

你好,今天,食物,娱乐,700

你好,今天,美食,娱乐,750

你好,今天,美食,娱乐,749

你好,今天,美食,娱乐,755

你好,今天,美食,娱乐,799

你好,今天,美食,娱乐,799

你好,今天,美食,娱乐,804

根据Column6值过滤后的预期数据表:

Column1,Column2,Column4,Column5,Column6

您好,今天,食物,娱乐,100

您好,今天,美食,娱乐,101

你好,今天,食物,娱乐,700

你好,今天,美食,娱乐,750

你好,今天,美食,娱乐,749

你好,今天,美食,娱乐,755

你好,今天,美食,娱乐,804

2 个答案:

答案 0 :(得分:1)

您可以为此使用linq而不是DataView

List<int> filter = new List<int>()
            {
               75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,281,303,405,406,493,599,601,606,610,626,630,639,640,647,648,651,662,664,671,672,680,689,697,701,703,706,709,712,717,718,724,735,740,741,743,744,767,768,769,770,775,780,791,799,800,801,802,803,805,806,807,808,810,811,812,815,816,817,818,820,836,837,873,874,875,879,881,895,896,897,902,903,904
            }; 


DataTable output = dt.AsEnumerable().Where((row,index) => !filter.Contains(index)).CopyToDataTable();

希望这能回答您的问题

答案 1 :(得分:0)

 // list of values to be filtered
            List<int> filter = new List<int>()
            {
               75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,281,303,405,406,493,599,601,606,610,626,630,639,640,647,648,651,662,664,671,672,680,689,697,701,703,706,709,712,717,718,724,735,740,741,743,744,767,768,769,770,775,780,791,799,800,801,802,803,805,806,807,808,810,811,812,815,816,817,818,820,836,837,873,874,875,879,881,895,896,897,902,903,904
            }; 

// LINQ statement to do filtering
  IEnumerable<DataRow> unmatchingRows = from DataRow row in dt.Rows
                                      where !filter.Contains((int)row[0])
                                      select row;
  // add to a new datatable
  DataTable output = dt.Clone();
  foreach (DataRow item in unmatchingRows)
  {
      output.ImportRow(item);
  }