2011-02-14 119 views
0

我的主要問題描述是這樣的:合併兩個列表的第一個列表的關鍵

BankAccount對象的兩個列表。 A BankAccount具有諸如BankCodeAccountNumber的屬性,其唯一地標識帳戶。所以這兩個列表可能包含相同的銀行賬戶,但它們可能有SourceAmountAccountTypes的不同。

這裏的目的是合併這兩個列表:

  1. 帳戶添加到第一個列表,如果它是在第二個(而不是在第一個列表)可用。
  2. 如果兩個銀行賬戶在兩個銀行賬戶中都相同,請更新第一個銀行賬戶的詳細信息,並在第二個銀行賬戶中填寫(匹配)銀行賬戶的詳細信息。

我試過實施一個SO post中提到的解決方案。我去了,並試圖在.NET代碼墊網站上寫下我的代碼。但是在嘗試執行第一行後,我無法獲得輸出。 93我已經評論過。

class BankAccount 
{ 
    public string BankCode{get;set;} 
    public string AccountNumber{get;set;} 
    public string AccountType{get;set;} 
    public string Amount{get;set;} 
    public string Source{get;set;} 

    public override bool Equals(object obj) 
    { 
     var acc = obj as BankAccount; 
     return Equals(acc); 
    } 

    public override int GetHashCode() 
    { 
     return this.GetHashCode(); 
    } 

    public bool Equals(BankAccount acc2) 
    { 
     if(acc2 == null) return false; 
     if(string.IsNullOrEmpty(acc2.BankCode)) return false; 
     if(string.IsNullOrEmpty(acc2.AccountNumber)) return false; 
     return this.BankCode.Equals(acc2.BankCode) && this.AccountNumber.Equals(acc2.AccountNumber); 
    } 
} 

//List<BankAccount> lst3 = lst.Union(lst1).ToList(); // line 93 

可以查看完整密碼here

PS:我不知道這是否可能是與鍵盤網站的問題。

更新 - 週一,2011年2月14日 - 4時50分二十四秒(AM)/四點五十分24秒GMT

感謝名單進行更新。但有些東西仍然是錯誤的。在輸出中,清單3的第一項應該有AccountType=PSource=lst2。第二個要求不符合。我圖Union()只做我需要的一部分。我需要做什麼來滿足第二個要求。

編輯通過drachenstern:我不知道這個稱號是更好,但它肯定比以前的標題更多的信息,以實際的問題:\

+0

你的問題是什麼? – Gabe 2011-02-14 03:25:25

回答

5

解決方案1:

這個解決方案沒有達到你的(新)規定的2個要求,但是試圖解決這個問題,試圖用LINQ Union()解決這個問題。

你已經有了,這是造成該線路上堆棧溢出異常遞歸調用(23):

public override int GetHashCode() 
{ 
    return this.GetHashCode(); 
} 

我建議將其更改爲這樣的事情:

public override int GetHashCode() 
{ 
    return (BankCode + AccountNumber).GetHashCode(); 
} 

編輯:

確保成員BankCount和AccountNumber永遠不會爲空或將拋出異常。我建議你查看覆蓋GetHashCode()方法的標準實踐。

ReSharper的的自動生成的GetHashCode覆蓋: (397值確保如果BANKCODE和賬戶號碼都換了號碼也不會發生衝突的選中意味着不會有與數* 397溢出問題)

public override int GetHashCode() 
{ 
    unchecked 
    { 
     return ((BankCode != null ? BankCode.GetHashCode() : 0)*397)^(AccountNumber != null ? AccountNumber.GetHashCode() : 0); 
    } 
} 

解決方案2:

該解決方案旨在實現您的要求2,不使用LINQ聯盟()。

如果你是想合併列表,使用第二列表爲偏好,那麼也許試試這個:

var mergedList = new List<BankAccount>(); 
// add items from lst or any duplicates from lst1 
foreach (var bankAccount in lst) 
{ 
    var account = bankAccount; 
    var dupe = lst1.FirstOrDefault(item => item.Equals(account)); 
    mergedList.Add(dupe ?? bankAccount); 
} 
// add any items in lst1 that are not duplicates 
foreach (var bankAccount in lst1.Where(item=>!mergedList.Contains(item))) 
{ 
    mergedList.Add(bankAccount); 
} 

如果你正在尋找的代碼最小化:

// add items from lst or any duplicates from lst1 
var temp = lst.Select(item => lst1.FirstOrDefault(item1 => item1.Equals(item)) ?? item); 
// add any items in lst1 that are not duplicates 
var result = temp.Union(lst1.Where(item => !temp.Contains(item))); 
0

問題是班級BankAccount中的此方法。它會導致堆棧溢出,因爲它不斷調用它自己。

public override int GetHashCode() 
{ 
    return this.GetHashCode(); 
} 

嘗試使用this.ToString()。GetHashCode()並重寫ToString,使其對類有意義。