繁体   English   中英

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

[英]C# merge two objects together at runtime

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

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

所以:

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

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

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

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

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

反思会起作用。 就像是:

public static void MergeWith<T>(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将在许多这些步骤中帮助您,而无需手动编写复杂的算法。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM