gpt4 book ai didi

ado.net - 检查 2 个数据表是否具有相同的架构

转载 作者:行者123 更新时间:2023-12-02 07:09:40 25 4
gpt4 key购买 nike

我想确保 2 个 Ado.net 数据表具有相同的架构:列数 + col 类型等。如何做到这一点?


假设我有变量:数据表 A 和数据表 B。我如何比较 A 的架构是否与 B 的架构相同

最佳答案

我不知道有什么内置方法可以比较数据表,而且在没有定义完整规范 (and you always should) 的情况下,我很可能会错过您关心的某些情况。

也就是说下面确实设法比较了两个数据表并确定以下是否为真

  • 两个DataTables的数据列数是否相同
  • 对于第一个数据表中的每个数据列,是否在另一个表中也存在相同类型的列不考虑顺序

它使用扩展方法并实现 IEqualityComparer 来进行比较。

测试用例

class Program
{
static void Main(string[] args)
{

DataTable dt1 = new DataTable();
dt1.Columns.Add(columnName: "a", type: Type.GetType("System.String"));
dt1.Columns.Add(columnName: "b", type: Type.GetType("System.Int32"));

DataTable dt2 = new DataTable();
dt2.Columns.Add(columnName: "a", type: Type.GetType("System.Int32"));
dt2.Columns.Add(columnName: "b", type: Type.GetType("System.String"));

DataTable dt3 = new DataTable();
dt3.Columns.Add(columnName: "a", type: Type.GetType("System.String"));
dt3.Columns.Add(columnName: "b", type: Type.GetType("System.Int32"));
dt3.Columns.Add(columnName: "c", type: Type.GetType("System.Int32"));


DataTable dt4 = new DataTable();
dt4.Columns.Add(columnName: "b", type: Type.GetType("System.Int32"));
dt4.Columns.Add(columnName: "a", type: Type.GetType("System.String"));


DataTable dt5 = new DataTable();
dt5.Columns.Add(columnName: "a", type: Type.GetType("System.String"));
dt5.Columns.Add(columnName: "b", type: Type.GetType("System.Int32"));


Console.WriteLine("dt1.SchemaEquals(dt1) | {0}", dt1.SchemaEquals(dt1));
Console.WriteLine("dt1.SchemaEquals(dt2) | {0}", dt1.SchemaEquals(dt2));
Console.WriteLine("dt1.SchemaEquals(dt3) | {0}", dt1.SchemaEquals(dt3));
Console.WriteLine("dt1.SchemaEquals(dt4) | {0}", dt1.SchemaEquals(dt4));
Console.WriteLine("dt1.SchemaEquals(dt5) | {0}", dt1.SchemaEquals(dt5));

if (System.Diagnostics.Debugger.IsAttached)
{
Console.ReadLine();
}


}


}

扩展方法

    public static class DataTableSchemaCompare
{
public static bool SchemaEquals(this DataTable dt, DataTable value)
{
if (dt.Columns.Count != value.Columns.Count)
return false;

var dtColumns = dt.Columns.Cast<DataColumn>();
var valueColumns = value.Columns.Cast<DataColumn>();


var exceptCount = dtColumns.Except(valueColumns, DataColumnEqualityComparer.Instance).Count() ;
return (exceptCount == 0);


}
}

IEqualityComparer 的实现

    class DataColumnEqualityComparer : IEqualityComparer<DataColumn>
{
#region IEqualityComparer Members

private DataColumnEqualityComparer() { }
public static DataColumnEqualityComparer Instance = new DataColumnEqualityComparer();


public bool Equals(DataColumn x, DataColumn y)
{
if (x.ColumnName != y.ColumnName)
return false;
if (x.DataType != y.DataType)
return false;

return true;
}

public int GetHashCode(DataColumn obj)
{
int hash = 17;
hash = 31 * hash + obj.ColumnName.GetHashCode();
hash = 31 * hash + obj.DataType.GetHashCode();

return hash;
}

#endregion
}

输出

dt1.SchemaEquals(dt1) | True
dt1.SchemaEquals(dt2) | False
dt1.SchemaEquals(dt3) | False
dt1.SchemaEquals(dt4) | True
dt1.SchemaEquals(dt5) | True
Press any key to continue . . .

关于ado.net - 检查 2 个数据表是否具有相同的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com