编程语言
首页 > 编程语言> > c#:检查数据行是否存在于具有动态列的其他数据表中

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: &nbsp: " + columnName + "<br/>";
           result += "Value &nbsp; " + 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