c# - 比较两个数据行值及其适当的类型
问题描述
我想知道是否有更好的方法来比较两个数据行的值,这就是我得到的,我用 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] + "}");
}
}
解决方案
推荐阅读
- python - Python 性能:While 与 For 循环
- pine-script - Pinescript:是否可以根据颜色创建条件?
- python - 如何使用 PyWin32 模块删除 Excel 中的总计和小计?
- amazon-web-services - Amazon cli 映像不适用于 Gitlab CI
- php - 如何使用 Doctrine 在几列上执行 WHERE 子句?
- mysql - 您想告诉我为什么即使我将 bundler 更新为“2.2.21”,Gemfile.lock 中 bundler 的版本仍然是“2.2.16”吗?
- json - Oracle REST 服务:获取内容类型为“application/json”的 REST API 错误消息
- python - 如何使用flask和python3从本地文件中读取一些图像然后显示在网页上?
- php - PHP MYSQL 选择 OneToMany 作为嵌套 json
- rust - 将未知类型转换为已知类型