首页 > 解决方案 > 比较两个数据行值及其适当的类型

问题描述

我想知道是否有更好的方法来比较两个数据行的值,这就是我得到的,我用 IComparer 尝试了泛型,但它需要在编译时传递类型,这在此处是不可能的。

    public static bool ByteArrayEquals(byte[] range1, int offset1, byte[] range2, int offset2, int count)
    {
        for (int i = count - 1; i >= 0; --i)
        {
            if (range1[offset1 + i] != range2[offset2 + i])
            {
                return false;
            }
        }
    
        return true;
    }
    
    bool DataRowObjectEquals(object dr1, object dr2, Type t)
    {
        if (dr1 == DBNull.Value && dr2 == DBNull.Value)
            return true;
        if (dr1 == DBNull.Value && dr2 != DBNull.Value || dr1 != DBNull.Value && dr2 == DBNull.Value)
            return false;
        //at this point we know both have actual values
        if(t.Name == "Decimal")
            return (decimal)dr1 == (decimal)dr2;             
        if (t.Name == "String")
            return (string)dr1 == (string)dr2;
        if (t.Name == "DateTime")
            return (DateTime)dr1 == (DateTime)dr2;
        if (t.Name == "Int32")
            return (int)dr1 == (int)dr2;
        if (t.Name == "Int16")
            return (short)dr1 == (short)dr2;
        if (t.Name == "Byte[]")
            return ByteArrayEquals((byte[])dr1, 0, (byte[])dr2, 0, ((byte[])dr1).Length);
        else
            throw new Exception("type not found");
    }

这就是我使用该函数的方式,我们将始终在两个数据表上具有相同的列和数据类型

foreach (DataColumn dc in wo1.DataSet.Tables["TABLE"].Columns.Cast<DataColumn>().OrderBy(p => p.ColumnName).ToList())
{
    if (!DataRowObjectEquals(dr1[dc.ColumnName], dr2[dc.ColumnName], dr1.Table.Columns[dc.ColumnName].DataType))
    {                            
        Console.WriteLine("\tCOLUMNS: " +
            dc.ColumnName + " (" + dc.DataType.ToString() + ") have different values: {" +
            dr1[dc.ColumnName] + "," + dr2[dc.ColumnName] + "}");
    }                            
}

标签: c#compare

解决方案


推荐阅读