2013-06-25 23 views
0

我循環通過KeyValuePair集合,然後複製鍵和值到新創建的類,如下所示的集合迭代:如何通過KeyValuePair

 Classes.MemberHierarchy membHier = new Classes.MemberHierarchy(); 
     List<Classes.MemberHierarchy> membHierList = new List<Classes.MemberHierarchy>(); 

     foreach (KeyValuePair<string, string[]> acct in acctData) 
     { 
      membHier.entityName = acct.Key; 
      membHier.Accounts = acct.Value; 
      membHierList.Add(membHier);     
     } 

問題是,第2次迭代, membHierList屬性會立即被第一次迭代中的值覆蓋。這很奇怪。

因此,在第一次迭代時,membHier.entityName是「ABC成員」,並且帳戶被填充字符串數組沒有問題。

然後在第二次迭代時,membHier.entityName是「XYZ成員」。

現在 「XYZ成員」 佔用兩個時隙如下

membHierList [0] = .base.entityName 「XYZ成員」 membHierList [1] .base.entityName = 「XYZ成員」

待辦事項我在上面有一個對象衝突?

預先感謝您.... 鮑勃

回答

3

不,它是不奇怪,因爲你聲明和循環之前初始化對象membHier只是一個時間,然後嘗試在插入新列表中的同一個對象。

這將解決您的問題

List<Classes.MemberHierarchy> membHierList = new List<Classes.MemberHierarchy>(); 

    foreach (KeyValuePair<string, string[]> acct in acctData) 
    { 
     Classes.MemberHierarchy membHier = new Classes.MemberHierarchy(); 
     membHier.entityName = acct.Key; 
     membHier.Accounts = acct.Value; 
     membHierList.Add(membHier);     
    } 

在每個循環中聲明的對象MemberHierarchy的新實例將填充不同的實例列表,每個實例有自己的價值觀。
取而代之的是,在循環外部進行初始化時,每次迭代都會使用提取的值更新同一個實例。但是membHier是一個引用類型,所以如果不是重新初始化,它指向存儲第一個實體的值的同一內存,並且您有效地用第二個實體覆蓋這些值。最後,列表中的所有元素指向相同的內存位置,並且這些內存位置包含最後一個實體的數據。

2

您需要的membHier建設移動到foreach循環的內部。現在編寫代碼的方式只創建一個MemberHierarchy類的實例。

List<Classes.MemberHierarchy> membHierList = new List<Classes.MemberHierarchy>(); 

foreach (KeyValuePair<string, string[]> acct in acctData) 
{ 
    Classes.MemberHierarchy membHier = new Classes.MemberHierarchy(); 
    membHier.entityName = acct.Key; 
    membHier.Accounts = acct.Value; 
    membHierList.Add(membHier);     
} 

使用當前的C#4.0的語法它看起來像:

var membHierList = new List<Classes.MemberHierarchy>(); 

foreach (var acct in acctData) 
{ 
    membHierList.Add(new Classes.MemberHierarchy 
    { 
     entityName = acct.Key; 
     Accounts = acct.Value; 
    }); 
} 
+0

感謝你們倆。完美! –