C# 为什么我的过滤器不工作?d、 DefaultView.RowFilter=cls;

C# 为什么我的过滤器不工作?d、 DefaultView.RowFilter=cls;,c#,filter,datatable,C#,Filter,Datatable,我只想对我的datatable应用一个行过滤器,它不工作,没有错误,只需要返回相同的datatable 我尝试从datatable创建一个dataview以便应用,但这也不会返回筛选列表。我不明白为什么下面的代码不起作用 DataTable d = processFileData(concatFile); string cls = String.Format("Column6 NOT IN ({0})", String.Join(",", returnClass())); d.DefaultVi

我只想对我的datatable应用一个行过滤器,它不工作,没有错误,只需要返回相同的datatable

我尝试从datatable创建一个dataview以便应用,但这也不会返回筛选列表。我不明白为什么下面的代码不起作用

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=34945条记录,如果我在文件上手动应用excel中的过滤器,预期结果应该是DataTable=29240条记录

下面是我试图用过滤器实现的示例:

原始数据表:

第1栏、第2栏、第4栏、第5栏、第6栏

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

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

你好,今天,食物,乐趣,79

你好,今天,食物,乐趣,79

你好,今天,食物,乐趣,79

你好,今天,食物,乐趣,100

你好,今天,食物,乐趣,101

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

你好,今天,食物,乐趣,750

你好,今天,食物,乐趣,749

你好,今天,食物,乐趣,755

你好,今天,食物,乐趣,799

你好,今天,食物,乐趣,799

你好,今天,食物,乐趣,804

基于第6列值筛选后的预期数据表:

第1栏、第2栏、第4栏、第5栏、第6栏

你好,今天,食物,乐趣,100

你好,今天,食物,乐趣,101

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

你好,今天,食物,乐趣,750

你好,今天,食物,乐趣,749

你好,今天,食物,乐趣,755


您好,今天,食物,乐趣,804

您可以使用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();
列表过滤器=新列表()
{
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输出=dt.AsEnumerable()。其中((行,索引)=>!filter.Contains(索引)).CopyToDataTable();
希望这能回答您的问题

//要筛选的值列表
 // 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);
  }
列表筛选器=新列表() { 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语句 IEnumerable unmatchingRows=来自dt.Rows中的DataRow行 哪里filter.Contains((int)行[0]) 选择行; //添加到新的数据表 DataTable output=dt.Clone(); foreach(数据行项目不匹配) { 输出、输入(项); }
如果需要新的数据表,请从筛选视图中创建它:
var newDt=d.DefaultView.ToTable()
。如果问题是过滤器不工作,那么问题就不在这里,除非只是名称不匹配。不能是类型不匹配,否则会出现异常。还是你?@Jimi i def上面的代码没有任何错误,我只是没有得到我认为应该得到的结果,我认为通过像我那样应用过滤器,我在那行之后对datatable所做的任何事情,我尝试了这个更改,只是为了测试过滤器是否正常,仍然没有任何结果datatable d=processFileData(concatFile);//string cls=string.Format(“Column6不在({0})”,string.Join(“,”,returnClass());string cls=“Column6不在(75,76)”;d.DefaultView.RowFilter=cls;DataTable classless=d.DefaultView.ToTable();过滤器会从视图中隐藏过滤后的行,但这些行仍然存在。如果要删除它们,请将过滤后的视图复制到数据表中。或者从SQL端进行过滤。那么,可能我一直在看这个问题,如果过滤后的行仍然存在,我该如何检查原始数据表是否已被删除在我处理新的数据记录之前进行筛选?因为我们需要较小的记录集,所以我需要确保我只处理后续的记录集。因此,是否可以进行检查以验证新记录集是否小于原始记录集?我进行了上述更改,看起来是这样的,但我在包含下得到了一条红线(索引)部分DataTable d=processFileData(concatFile);string cls=string.Format(“Column6不在({0})”,string.Join(“,”,returnClass());//string cls=“Column6不在(75,76)”;d.DefaultView.RowFilter=cls;DataTable输出=d.AsEnumerable()。其中((行,索引)=>!cls.Contains(index)).CopyToDataTable();不要使用dataview.rowfilter。相反,请在我的回答中使用linq语句循环遍历您的数据表,并将列表中不包含的所有项目保存到新的数据表中。我将其清理为此数据表d=processFileData(concatFile);string cls=string.Format(“Column6不在({0})”,String.Join(“,”,returnClass());DataTable输出=d.AsEnumerable()。其中((行,索引)=>!cls.Contains(index)).CopyToDataTable();但它不喜欢Contains()错误状态中的索引,无法从int转换为String我认为cls变量不是集合,它是“String”类型“。它必须是与您的datatable列类型相同的集合。然后您基本上会说-将我的datatable列中不包含在cls集合中的所有值保存到新的da