C#在运行时将两个对象合并在一起

我有一种情况,我从Excel加载一个非常非标准化的记录集。 我拉入每一行并一次创建一个对象。 每行可以包含公司和/或客户。

我的问题是多行可能有相同的对象,所以我可能已经创建了它。 我做了一个比较,看看它是否已经在列表中。 如果是这样,我需要合并这两个对象,以确保我没有从第二行获得任何新信息。

所以:

company - client - address - phone ---------------------------------------- mycompany - - myaddress - mycompnay - myclient - - myphone 

所以第一行会创建一个地址为“myaddress”的公司对象。 第二行将创建另一个公司对象(根据我的规则是同一公司,名称相同),这也有一个客户端引用和一个电话号码。

所以我知道它们是相同的,但需要确保所有数据合并到一个对象中。

目前我正在创建一个实用程序类,它接受两个对象(一个是主要的,另一个是合并的,所以如果存在冲突,则一个优先级),它会遍历每个变量并分配值(如果有的话) 。 这是一个沉重的锅炉板,我希望可能有一些实用工具,我可以利用它为我做手动工作。

这个例子已经简化,因为有一些其他变量,一些基本类型和其他更复杂的项目。

反思会起作用。 就像是:

 public static void MergeWith(this T primary, T secondary) { foreach (var pi in typeof(T).GetProperties()) { var priValue = pi.GetGetMethod().Invoke(primary, null); var secValue = pi.GetGetMethod().Invoke(secondary, null); if (priValue == null || (pi.PropertyType.IsValueType && priValue.Equals(Activator.CreateInstance(pi.PropertyType)))) { pi.GetSetMethod().Invoke(primary, new object[]{secValue}); } } } 

我试图把它分开:分而治之。

首先,读取一个巨大列表中的所有对象。

在第二步中,使用主键选择不同的列表,例如公司名称。 从不同的列表中,使用具有最大字段数的项(主)。 然后,迭代尚未在主服务器中的所有字段并合并它们的值.LINQ将在许多这些步骤中帮助您,而无需手动编写复杂的算法。

这允许稍后容易地定制逻辑,例如,如果您有一组不同的“主键”可以说或者您想要对特定字段进行特殊比较。

我已经尝试过Kyle Finley将两个对象合并为一个匿名类型 ,它的工作非常完美。

使用TypeMerger ,合并就像一样简单

var obj1 = new {foo = "foo"};

var obj2 = new {bar = "bar"};

var mergedObject = TypeMerger.MergeTypes(obj1 , obj2 );

这就是你得到了合并的对象,除此之外,还有一个规定可以忽略特定的属性。

尝试创建基于字符串的哈希表。 使用您认为是重复记录触发器的字段子集的串联作为键。 哈希表不允许重复,因此您可以将此错误用作执行进一步处理的触发器。

在不了解您的环境和要求的情况下,这可能毫无用处。 但是,如果您有某种数据库后端可用(甚至是免费的客户端),您可以将数据存储在表中并使用SQL Merge语句来更新数据。 合并操作将根据需要添加或更新记录。 触发器可以进一步细化操作。 这是一个相当重要的解决方案,但如果您已经在混合中使用了一些DBMS,那么它可能是一种实现它的简单方法。

当您从Excel检索数据时,不需要为每一行创建一个对象。实际上,您可能希望转到一个读取前面所有行的中间表单,然后从那里创建对象。 使用哈希表的Kibbey解决方案也适用于此。