[英]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.