3

我正在遍历 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 成员”,并且 Accounts 填充了字符串数组没有问题。

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

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

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

我上面有对象冲突吗?

提前谢谢你....鲍勃

4

2 回答 2

6

不,这并不奇怪,因为您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);                
    }

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

于 2013-06-25T21:09:41.633 回答
3

您需要将构造移动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;
    });
}
于 2013-06-25T21:09:16.927 回答