2012-02-10 3 views
1

я есть список массив уникальных идентификаторовфильтр DataTable, используя ArrayList

ex 1,2,3,4.... 

и DataTable с записями с вышеуказанными идентификаторами

ID Name 
1  abc 
2  xxx 
3  aaa 
4  bbb 
5  eee 
6  fff 

я нужно фильтровать таблицу данных в соответствии с перечнем массива содержание

ex: if array list contain 1,2 

то DataTable должен быть отфильтрован только для того, чтобы содержать эти две записи. Есть ли какой-либо вариант на Da taTable, что я мог бы сделать это иначе, чем запустить DataTable внутри For Loop и получить каждый DataRow?

ответ

3

Вы можете использовать Linq для фильтрации и создания нового DataTable.

var filtered = 
    table.AsEnumerable() 
     .Where(r => list.Contains(r.Field<int>("ID"))) 
     .CopyToDataTable(); 

Учитывая список, содержащий {1, 2}, отфильтрованная таблица будет содержать строки {{1, "абв"}, {2, "ххх"}}

Side Примечание: В то время как вам может использовать ArrayLists, предпочтительнее использовать общий аналог System.Collections.Generic.List<T> в новом коде, написанном на .NET. Дженерики были представлены как часть .NET 2.0/C# 2.0/VB 8/Visual Studio 2005. Настоящими изданиями на рынке являются .NET 4.0/C# 4.0/VB 10/Visual Studio 2010. ArrayLists фактически устарели, за исключением случаев, когда поддерживающий код, созданный в более ранних версиях langauge и framework.

Кроме того, если список особенно велик, его можно было бы сначала загрузить в HashSet<T> перед запросом, так как он будет более эффективным при использовании метода Contains.


Полный рабочий код демонстрации:

var table = new DataTable(); 
table.Columns.Add("ID", typeof(int)); 
table.Columns.Add("Name", typeof(string)); 
table.Rows.Add(1, "abc"); 
table.Rows.Add(2, "xxx"); 
table.Rows.Add(3, "aaa"); 
table.Rows.Add(4, "bbb"); 
table.Rows.Add(5, "eee"); 
table.Rows.Add(6, "fff"); 

// var list = new ArrayList(); // do not prefer 
var list = new List<int>(); 
list.Add(1); 
list.Add(2); 

var filtered = 
    table.AsEnumerable() 
     .Where(r => list.Contains(r.Field<int>("ID"))) 
     .CopyToDataTable(); 
+0

я получаю исключение - "Источник не содержит DataRows." но все же DataTable имеет идентификаторы в ArrayList – chamara

+0

Эта ошибка возникает только в том случае, если исходная таблица не имеет строк * или * ни один из них не передает предикат в том месте. Таким образом, либо ваша исходная таблица пуста, либо не соответствует значениям в вашем списке. Вам придется отлаживать, чтобы проверить. Я публикую полный фрагмент кода, чтобы продемонстрировать рабочее поведение. –

+0

, как вы упомянули, я начал использовать Список , теперь он работает. Согласно описанному выше методу фильтрации, для фильтрационного кода DataTable требуются целые элементы в списке. Thanx для справки. – chamara

Смежные вопросы