2013-06-25 2 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 член"

Do У меня предмет конфликта выше?

Спасибо заранее .... Боб

ответ

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 внутрь петли Еогеасп. Теперь, когда ваш код написан, создается только один экземпляр класса 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

благодаря вам. Отлично ! –