C# 比较数据表和合并更改

C# 比较数据表和合并更改,c#,datatable,C#,Datatable,我有两个结构相同的数据表A,B。我需要将A的每一行与B的每一行进行比较,结果数据表C应该将A中的行和B中该行的变化放在下面。对于A&B中相同值的行,生成的数据表不应包含这些行 因此,生成的数据表应该在A中有每一行,在B中有不相同的行。结果表不应有相同的行 任何人都可以帮助我使用C代码。最简单的方法是跨数据库联合: create table merged (select * from db1.t) union (select * from db2.t) 只返回唯一的行。要比较记录,请选择共享相同

我有两个结构相同的数据表A,B。我需要将A的每一行与B的每一行进行比较,结果数据表C应该将A中的行和B中该行的变化放在下面。对于A&B中相同值的行,生成的数据表不应包含这些行

因此,生成的数据表应该在A中有每一行,在B中有不相同的行。结果表不应有相同的行


任何人都可以帮助我使用C代码。

最简单的方法是跨数据库联合:

create table merged
(select * from db1.t) union (select * from db2.t)
只返回唯一的行。要比较记录,请选择共享相同键的行。合并的键列将不唯一

select * from merged order by key
按您想要的顺序排列结果

select * from merged where key in
(select key from merged group by key having count(*) > 1)
order by key

将只返回不匹配的行。

看起来您想计算两个数据集的行数。我们可以使用一点LINQ、一个相等比较器和一些扩展方法来实现这一点。该代码经过测试并正常工作

class Program
{
    static void Main()
    {
        var a = new DataTable {Columns = {{"FirstName", typeof (string)}, {"Age", typeof (int)}}, Rows = {{"Alice", 31}, {"Bob", 42}}};
        var b = new DataTable {Columns = {{"FirstName", typeof (string)}, {"Age", typeof (int)}}, Rows = {{"Alice", 31}, {"Carol", 53}}};
        var diffs = a.SymmetricDifference(b);
        Console.Write(diffs.Rows.Count);
    }
}

public static class DataTableExtensions
{
    public static DataTable SymmetricDifference(this DataTable a, DataTable b)
    {
        var diff = a.Clone();
        foreach (var person in a.AsPersonList().SymmetricDifference(b.AsPersonList()))
        {
            diff.Rows.Add(person.FirstName, person.Age);
        }

        return diff;
    }

    private static IEnumerable<Person> SymmetricDifference(this IEnumerable<Person> a, IEnumerable<Person> b)
    {
        return a.SymmetricDifference(b, new PersonComparer());
    }

    private static IEnumerable<T> SymmetricDifference<T>(this IEnumerable<T> a, IEnumerable<T> b, IEqualityComparer<T> comparer)
    {
        return a.Except(b, comparer).Concat(b.Except(a, comparer));
    }

    private static IEnumerable<Person> AsPersonList(this DataTable table)
    {
        return table.AsEnumerable().Select(row => row.AsPerson()).ToList();
    }

    private static Person AsPerson(this DataRow row)
    {
        return new Person
                   {
                       FirstName = row.Field<string>("FirstName"),
                       Age = row.Field<int>("Age")
                   };
    }
}

public class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person a, Person b)
   {
        return a.FirstName == b.FirstName && a.Age == b.Age;
   }

   public int GetHashCode(Person item)
   {
        return StringComparer.InvariantCultureIgnoreCase.GetHashCode(item.FirstName)
               + StringComparer.InvariantCultureIgnoreCase.GetHashCode(item.Age);
   }
}

public class Person
{
    public string FirstName;
    public int Age;
}

由于这两个数据表来自不同的数据库,我不能使用Sql或Oracle查询进行跨数据库联合。在C.net中有没有实现这一点的方法??一种方法是将数据转储到csv并导入,让sql进行比较的速度最快。我们是否可以直接比较两个数据表并获得所需的结果,而不是将数据转储到csv中??您可以为每个数据库选择所有行到哈希表中,然后比较每一行你需要用C语言还是可以使用工具?