2011-12-21 3 views
1

Каков наиболее эффективный способ фильтрации DataRows в DataTable? У меня есть список целых чисел и вы хотите получить все строки (и в конечном итоге создать из них DataTable), которые соответствуют целым числам в списке. В настоящее время я использую код ниже, но он довольно медленный. Я пропустил более эффективный способ?Эффективный фильтр DataTable

foreach (var i in integerlist) 
{ 
    DataRow dr = (from row in originalDataTable.AsEnumerable() 
        where row.Field<int>("urlID") == i 
        select row).FirstOrDefault<DataRow>(); 

    if (dr!= null) 
    { 
      newDataTable.Rows.Add(dr); 
    } 
} 
+0

взгляните на http://stackoverflow.com/questions/1268993/select-rows-from-a-dataset-using-linq-where-the-list-of-rowsids-are-in-a-list я надеюсь, что это поможет вам ... –

ответ

3

Я предлагаю вам попробовать сделать наоборот.

foreach (var row in originalDataTable) 
{ 

    if(integerList.Contains((int)row["urlID"])) 
     newDataTable.ImportRow(row) 
} 

Это имеет еще больший смысл, если у вас есть больше строк в наборе данных, а затем целые числа в вашей коллекции int. Надеюсь, что это поможет :)

+0

Спасибо. Я попробовал код, но мне пришлось изменить 'newDataTable.Add (row)' на 'newDataTable.Rows.Add (row)', потому что не было метода 'Add'. Однако, когда я его запускал, я получил эту ошибку. Эта строка уже принадлежит другой таблице. – Skoder

+1

Извините, это всего лишь фрагмент. Вам нужно будет вызвать newDataTable.ImportRow (строка) – Elastep

+0

Большое спасибо, что работает! – Skoder

1

Хм ... может быть я что-то не хватает, но ...

woudn't быть проще просто использовать DataView и применить RowFilter для него?

+0

Я думал то же самое ... Тем не менее, я думаю, что ответ @ Elastep скорее является решением исходной проблемы. Хороший момент, хотя! – Jemes

+0

o6tech: непонятно, в чем смысл кода, на который вы ссылаетесь. Вы можете создать * новый * DataTable из отфильтрованного DataView, если вам нужно. Я лично сомневаюсь, что OP * действительно нуждается в новом DataTable. – Tigran

+0

Спасибо, я посмотрю, смогу ли я это использовать. Мне нужен DataTable, потому что он помещается в базу данных SQL Server, и мне нужны данные в формате DT. – Skoder

0

Как @Tigran говорит, что вы можете использовать dataview, отметьте this msdn article о том, как это сделать.

В основном вы используете DataView для фильтрации данных, и вы вызываете метод DataView.ToTable, чтобы получить новый DataTable.

1

вы могли бы попробовать сделать объединение таких как:

var resultSet = 
from row in originalDataTable.AsEnumerable() 
join i in integerlist 
on row.Field<int>("urlID") equals i 
select row; 

, который должен дать вам полный набор результатов. , если вам нужна дата, которую вы могли бы сделать:

resultSet.CopyToDataTable();

+0

Я получаю «ожидаемые контекстные ключевые слова равны» в 'select'. – Skoder

+0

Извините было == вместо equals, должен был проверить синтаксис –

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