我只想对我的数据表应用行过滤器,并且行过滤器不起作用,没有错误,只是返回相同的数据表。
我曾尝试从数据表创建一个数据视图以进行应用,但是这也不会返回过滤后的列表。我不知道为什么下面的代码行不通..
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
答案 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);
}