如何遍历KeyValuePair的集合

bob*_*zzo 1 c#-4.0 keyvaluepair

我遍历KeyValuePair的集合,然后将Key和Value复制到一个新创建的类中,如下所示:

     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);                
        }
Run Code Online (Sandbox Code Playgroud)

问题在于,在第二次迭代中,membHierList属性立即被第一次迭代中的值覆盖。真奇怪

因此,在第一次迭代时,membHier.entityName是“ ABC Member”,并且使用字符串数组填充Accounts没问题。

然后在第二次迭代中,membHier.entityName为“ XYZ成员”。

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

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

我上方有物体冲突吗?

预先谢谢你。

Ste*_*eve 5

不,这并不奇怪,因为您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);                
    }
Run Code Online (Sandbox Code Playgroud)

MemberHierarchy在每个循环中声明对象的NEW实例将在列表中填充不同的实例,并且每个实例都有其自己的值。
取而代之的是,在循环外进行初始化,在每次迭代时,您都使用提取的值更新同一实例。但是membHier是引用类型,因此,如果不进行初始化,它会指向存储第一个实体的值的同一内存,并有效地用第二个实体覆盖这些值。最后,列表中的所有元素都指向相同的存储位置,并且这些存储位置包含最后一个实体的数据