如何遍历KeyValuePair的集合

时间:2013-06-25 21:06:52

标签: 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);                
        }

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

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

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

现在“XYZ会员”占据两个位置,如下所示

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

我上面有对象冲突吗?

提前谢谢.... 鲍勃

2 个答案:

答案 0 :(得分: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);                
    }

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

答案 1 :(得分: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;
    });
}