c#:检查数据行是否存在于具有动态列的其他数据表中
作者:互联网
我想检查一个数据表中的数据行是否存在于另一数据表中.
我有两个数据表.将会有一些相同并且都存在的DataRows.如果我每次都知道会有哪些列,那么这将非常容易,但是我不知道.使用类似…
datatable.Rows[i].Field <String> columnName);
将不起作用,因为此字段可以是整数,字符串或日期/时间.但是,我确实知道两个文件共享相同的列名.
我的代码是零零碎碎的,但这是到目前为止的样子.现在,我生成一个列名列表,仅此而已.
for (var h = 0; h < origDbfFile.datatable.Columns.Count; h++) {
columnNames.Add(origDbfFile.datatable.Columns[h].ColumnName);
}
我正在进行一场恶梦,如果有人可以找到更清洁的解决方案,将不胜感激!
for (int g = 0; g < origDbfFile.dataset.Tables[0].Rows.Count; g++)
{
for (int h = 0; i < modDbfFile.dataset.Tables[0].Columns.Count; h++)
{
foreach (String columnName in columnNames)
{
String rowValue = origDbfFile.dataset.Tables[0].Rows[g].Field<String>(Convert.ToString(columnName));
//test data
result += "Column name:  : " + columnName + "<br/>";
result += "Value " + rowValue + "<br/><br/>";
//if logic will go below
}
}
}
解决方法:
假设您对装箱/拆箱和行值的值/引用类型没有问题,那么在给定情况下,您的代码几乎可以解决.
当然,如果您喜欢linq和扩展方法,则可以使其更出色
public static class DataRowExtensions
{
public static int IndexIn(this DataRow thisRow, DataTable table)
{
return table.Rows
.OfType<DataRow>()
.Select((row, i) => new { row, index = i + 1 })
.Where(pair => EqCondition(thisRow, pair.row))
.Select(pair => pair.index)
.FirstOrDefault() - 1;
}
public static bool EqCondition(DataRow row1, DataRow row2)
{
// check for the equality of row values
return true;
}
}
...
for (int i = 0; i < tab1.Rows.Count; i++)
{
var index = tab1.Rows[i].IndexIn(tab2);
if (index < 0)
{
Console.WriteLine("The row at index {0} was not found in second table", i);
}
else
{
Console.WriteLine("The row at index {0} was found in second table at index", i, index);
}
}
但是除了在找到第一个匹配项后中断之外,代码完全相同.
我的建议是使用id相等,但要记住,大多数情况下数据来自具有索引的数据源,在这种情况下您可能会发现自己.
PS.在您的第二秒,因为您有2个错误
>您声明了h但使用了i
>我想您应该使用.Rows.Count
标签:datarow,loops,datatable,c 来源: https://codeday.me/bug/20191030/1971064.html