2016-06-17 3 views
0

У меня есть этот DataTables:Сравните 2 DataTables

TableObrazkyD:(column name:NAZEV_OBRAZKU) 
    filename1.jpg 
    filename2.jpg 
    filename3.jpg 
    filename4.jpg 
    filename1.jpg 

TableObrazkyFTP:(column name:nazevF) 
    filename1.jpg 
    filename3.jpg 

Я хочу этот результат:

TableObrazkyRozdil: 
    filename2.jpg 
    filename4.jpg 

Мне нужно сравнить эти 2 DataTables и строк, которые пропускают в TableObrazkyFTP записи в DataTable: TableObrazkyRozdil Теперь я пробую это, но он пишет все строки, а не только пропущенные строки:

var neniNaFTP = TableObrazkyD.AsEnumerable() 
    .Select(r => r.Field<string>("NAZEV_OBRAZKU")) 
    .Except(TableObrazkyFTP.AsEnumerable() 
      .Select(r => r.Field<string>("nazevF"))); 
TableObrazkyRozdil = TableObrazkyD.AsEnumerable() 
    .Where(ra => !TableObrazkyFTP.AsEnumerable() 
       .Any(rb => rb[0] == ra[0])) 
    .CopyToDataTable(); 

У вас есть идеи, пожалуйста?

+1

Вы хотите, чтобы проверить, если таблицы содержат одни и те же данные в одних и тех же местах, или? Я не мог понять, что вы подразумеваете под «компилятором» и чего вы хотите достичь. –

+0

@D. Петров: Мне нужно скопировать все строки в таблице: TableObrazkyD, который не находится в таблице: TableObrazkyFTP к новому datatable: TableObrazkyRozdil – Lukas

+0

@Lukas, у вас есть повторное значение 'filename1.jpg'. Должен ли один экземпляр быть включен в таблицу результатов? Если да, то какой? – Charles

ответ

0

Я думаю, что вы имеете в виду вы хотите:

var TableObrazkyRozdil = TableObrazkyD.AsEnumerable() 
             .Where(tbl1 => ! TableObrazkyFTP.Any(tbl2 => tbl1.NAZEV_OBRAZKU == tbl2.nazevF)) 
             .CopyToDataTable(); 

Все таблицы TableObrazkyD, которая не содержится в таблице TableObrazkyFTP.

Это вернет:

neniNaFTP:(column name:NAZEV_OBRAZKU) 
    filename2.jpg 
    filename4.jpg 
+0

Да, но как я пишу вместо tbl1.NAZEV_OBRAZKU: tbl1. Колонка [0]? – Lukas

+0

Попробуйте 'tbl1.Columns [0]' – Charles

+0

Я пытаюсь, но это не так ... – Lukas

1

Вы можете использовать следующий подход, который использует HashSet<string>.Contains для быстрого поиска:

var ftpNazevF = TableObrazkyFTP.AsEnumerable().Select(r => r.Field<string>("nazevF")); 
var ftpRows = new HashSet<string>(ftpNazevF); 

var neniNaFtpRows = TableObrazkyD.AsEnumerable() 
    .Where(row => !ftpRows.Contains(row.Field<string>("NAZEV_OBRAZKU"))); 
DataTable neniNaFtpTable = null; 
if(neniNaFTPRows.Any()) 
    neniNaFtpTable = neniNaFtpRows.CopyToDataTable(); 

Обратите внимание, что CopyToDataTable генерирует исключение, если нет строки, так как он создает столбцы DataTable из первой строки в последовательности. Поэтому вы должны проверить это, как показано выше.

+0

Просто голова, его переменные имена находятся в Чеше, поэтому он может не понимать, что вы делаете очень хорошо. neniNaFTP буквально переводит не на FTP – Charles

+0

@Charles: done. Но я предпочитаю сделать это понятным для всех, кто не только чешский.) –

+0

Полностью согласен, может быть, добавить комментарии на английском языке, если вы это слишком непрозрачно? – Charles

0

Попробуйте что-то вроде этого:

var filesToExclude = TableObrazkyFTP.AsEnumerable() 
          .Select(r => r.Field<string>("nazevF")).ToArray(); 

var TableObrazkyRozdil = TableObrazkyD.AsEnumerable() 
.Except(r => filesToExclude.Contains(r.Field<string>("NAZEV_OBRAZKU"))).CopyToDataTable(); 
Смежные вопросы