我正在迭代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会员”
我上面有对象冲突吗?
提前谢谢.... 鲍勃
答案 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;
});
}