Почему мой фильтр не работает?d.DefaultView.RowFilter = cls; - PullRequest
1 голос
/ 21 июня 2019

Я просто хочу применить фильтр строк к моей таблице данных, и он не работает, нет ошибок, просто вернуть тот же самый набор данных.

Я попытался создать представление данных из таблицы данных, чтобы применить, но это также не возвращает отфильтрованный список. Я заблудился, почему этот код ниже не работает ..

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 к файлу, ожидаемые результаты должны быть DataTable = 29 240 записей.

Вот пример того, что я пытаюсь сделать с помощью фильтра:

Исходная таблица данных:

Столбец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

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Вы можете просто использовать 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();

Надеюсь, что это отвечает на ваш вопрос

0 голосов
/ 21 июня 2019
 // 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);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...