比较2个数据表有条件
Compare 2 data tables with a condition
我有一个DataTable
dtA
,有以下记录:
ColumnA ColumnB
1001 ARCH
1001 ARCH
1002 CUSS
1003 ARCH
还有一个DataTable
dtB
记录如下:
ColumnA
ARCH
CUSS
我需要比较两个DataTables
,如果dtB
中有ARCH
,则在dtA
中搜索ARCH
,当在 dtA
中首次出现 ARCH
,停止进一步搜索并写入日志。
如果 ARCH
不存在于 dtA
中,则取 dtB
的第二条记录,即 CUSS
,当 [=27= 第一次出现时] 在 dtA
中遇到,停止进一步搜索并写入日志。
我尝试使用 DataTable.Select()
方法,但未能成功。
请专家帮忙
编辑:
bool flag = true;
for (int counter = 0; counter < dtB.Rows.Count; counter++)
{
var contains = dtA.Select("ColumnB = '" + dtB.Rows[counter][0].ToString() + "'");
if (contains.Length == 0 && flag == true)
{
dtLogs.Rows.Add("CostCode not present in the Excel");
flag = false;
break;
}
}
此致
您可以使用 HashSet
作为高效的查找集合,如果您不止一次需要它,我会使用它:
var lookup = new HashSet<string>(dtA.AsEnumerable().Select(r => r.Field<string>("ColumnB")));
foreach(DataRow row in dtB.Rows)
{
string value = row.Field<string>("ColumnA");
if(lookup.Contains(value))
{
// write to log
}
}
您也可以使用 Enumerable.Contains
,它需要更少的内存但更多的 CPU 周期:
var allBinA = dtA.AsEnumerable().Select(r => r.Field<string>("ColumnB"));
foreach (DataRow row in dtB.Rows)
{
string value = row.Field<string>("ColumnA");
if (allBinA.Contains(value))
{
// write to log
}
}
我有一个DataTable
dtA
,有以下记录:
ColumnA ColumnB
1001 ARCH
1001 ARCH
1002 CUSS
1003 ARCH
还有一个DataTable
dtB
记录如下:
ColumnA
ARCH
CUSS
我需要比较两个DataTables
,如果dtB
中有ARCH
,则在dtA
中搜索ARCH
,当在 dtA
中首次出现 ARCH
,停止进一步搜索并写入日志。
如果 ARCH
不存在于 dtA
中,则取 dtB
的第二条记录,即 CUSS
,当 [=27= 第一次出现时] 在 dtA
中遇到,停止进一步搜索并写入日志。
我尝试使用 DataTable.Select()
方法,但未能成功。
请专家帮忙
编辑:
bool flag = true;
for (int counter = 0; counter < dtB.Rows.Count; counter++)
{
var contains = dtA.Select("ColumnB = '" + dtB.Rows[counter][0].ToString() + "'");
if (contains.Length == 0 && flag == true)
{
dtLogs.Rows.Add("CostCode not present in the Excel");
flag = false;
break;
}
}
此致
您可以使用 HashSet
作为高效的查找集合,如果您不止一次需要它,我会使用它:
var lookup = new HashSet<string>(dtA.AsEnumerable().Select(r => r.Field<string>("ColumnB")));
foreach(DataRow row in dtB.Rows)
{
string value = row.Field<string>("ColumnA");
if(lookup.Contains(value))
{
// write to log
}
}
您也可以使用 Enumerable.Contains
,它需要更少的内存但更多的 CPU 周期:
var allBinA = dtA.AsEnumerable().Select(r => r.Field<string>("ColumnB"));
foreach (DataRow row in dtB.Rows)
{
string value = row.Field<string>("ColumnA");
if (allBinA.Contains(value))
{
// write to log
}
}