遍历DataTable

时间:2019-05-19 20:54:05

标签: c#

尽管第二张表中的值是第一张表中值的1.5 *,但我正在尝试证明两个数据表之间的相等性。

执行比较时,我无法迭代超过数据表的第一行。 foreach循环仅迭代第一行。

我的比较功能:

public static bool CompareRowContent(DataTable table1, DataTable table2)
        {
            foreach (DataRow row1 in table1.Rows)
            foreach (DataRow row2 in table2.Rows)
            {
                var decimals1 = GetDecimals(row1.ItemArray, (decimal)1.5);
                var decimals2 = GetDecimals(row2.ItemArray, (decimal)1.0);
                if (decimals1.SequenceEqual(decimals2))
                {
                    return true;
                }

                return false;
            }

            return false;
        }   

乘数函数:

static List<decimal> GetDecimals(object[] array, decimal multiplier)
        {
            var list = new List<decimal>();
            foreach (object value in array)
            {
                try
                {
                    decimal result = (decimal) value;
                    result *= multiplier;
                    list.Add(result);
                }
                catch
                {
                    // Error.
                }
            }

            return list;
        }

...以及我试图证明行数相等的测试:

[TestMethod]
        public void Compare_Values()
        {
            bool compareValueResult = Helper.CompareRowContent(_table1, _table2);
            Assert.IsTrue(compareValueResult, "Row content does not match");
        }

我希望foreach循环遍历表中的每一行,如果匹配则返回true,否则返回false。实际结果仅基于第一行为“ true”,但不评估其他行。

如果我看着小数点1和小数点2变量,整个表都在那儿...但是在循环中从未使用过。

请帮助我遍历整个数据表!

1 个答案:

答案 0 :(得分:2)

您有一个嵌套循环,可以将table1中的每一行与table2中的每一行进行比较。

编写该代码的最简单方法是:

public static bool CompareRowContent(DataTable table1, DataTable table2)
{
    if (table1.Rows.Count != table2.Rows.Count)
    {
        return false;
    }

    for (int i = 0; i < table1.Rows.Count; i++)
    {
        var row1 = table1.Rows[i];
        var row2 = table2.Rows[i];
        var decimals1 = GetDecimals(row1.ItemArray, (decimal)1.5);
        var decimals2 = GetDecimals(row2.ItemArray, (decimal)1.0);
        if (!decimals1.SequenceEqual(decimals2))
        {
            return false;
        }
    }

    return true;
}