簡體   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