C# 4.0 如何遍历KeyValuePair集合

C# 4.0 如何遍历KeyValuePair集合,c#-4.0,keyvaluepair,C# 4.0,Keyvaluepair,我正在迭代KeyValuePair的集合,然后将密钥和值复制到新创建的类中,如下所示: Classes.MemberHierarchy membHier = new Classes.MemberHierarchy(); List<Classes.MemberHierarchy> membHierList = new List<Classes.MemberHierarchy>(); foreach (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);                
        }
Classes.MemberHierarchy membHier=新类.MemberHierarchy();
List membHierList=新列表();
foreach(acctData中的KeyValuePair acct)
{
membHier.entityName=账户密钥;
membHier.Accounts=账户价值;
membHier list.Add(membHier);
}
问题是在第二次迭代时,membHierList属性会立即被第一次迭代中的值覆盖。这很奇怪

因此,在第一次迭代时,membHier.entityName是“ABC成员”,并且帐户将使用字符串数组填充,没有问题

然后在第二次迭代时,membHier.entityName是“XYZ成员”

现在,“XYZ成员”占用两个插槽,如下所示

membHierList[0]。base.entityName=“XYZ成员” membHierList[1].base.entityName=“XYZ成员”

上面有物体冲突吗

先谢谢你。。。。
Bob

您需要将
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);                
}
List membHierList=newlist();
foreach(acctData中的KeyValuePair acct)
{
Classes.MemberHierarchy membHier=新类.MemberHierarchy();
membHier.entityName=账户密钥;
membHier.Accounts=账户价值;
membHier list.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;
    });
}
var membHierList=newlist();
foreach(账户数据中的var账户)
{
membHierList.Add(新类.MemberHierarchy)
{
entityName=账户密钥;
账户=账户价值;
});
}

不,这并不奇怪,因为在循环之前只声明并初始化了对象
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);                
    }
List membHierList=newlist();
foreach(acctData中的KeyValuePair acct)
{
Classes.MemberHierarchy membHier=新类.MemberHierarchy();
membHier.entityName=账户密钥;
membHier.Accounts=账户价值;
membHier list.Add(membHier);
}
在每个循环中声明对象的新实例
MemberHierarchy
,将使用不同的实例填充列表,每个实例都有自己的值。
相反,当初始化在循环之外时,在每次迭代中,您都使用提取的值更新同一实例。但是
membHier
是一种引用类型,因此如果不重新初始化,它将指向存储第一个实体的值的同一内存,您可以使用第二个实体有效地覆盖这些值。最后,列表中的所有元素都指向相同的内存位置,这些内存位置包含最后一个实体的数据