繁体   English   中英

比较2个数据表

[英]Compare 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个数据表和行,在TableObrazkyFTP中将其遗漏到数据表中: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();

请问您有什么想法吗?

您可以使用以下使用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的列。 因此,您必须如上所述进行检查。

我想你的意思是你想要这个:

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

尝试这样的事情:

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM