我有一个包含这样一个对象的List:
List<unit> unitlist = new List<unit>();
单位beeing初始化如下:
public class unit
{
public string[] records;
}
然后我使用变量添加到列表中:
var temp = new unit();
temp.records = csv.GetFieldHeaders; // using lumenworks framework to read a csv
unitlist.Add(temp);
当我现在使用csv中的新项目行覆盖temp时,列表unitlist中的条目也会更改:
while (csv.ReadNextRecord())
{
for (int i = 0; i < csv.Fieldcount; i++)
{
// Read the csv entry in the temp variable
temp.records[i] = csv[i];
}
// check for specific field, and write to list
if (temp.records[8] == "Ja")
unitlist.Add(temp);
}
当我现在检查unitlist时,所有条目都是csv的最后一行,因为当temp-variable发生变化时它们都会被更改。为什么会这样?如何将List unitlist与变量temp?
分开答案 0 :(得分:2)
因为您使用相同的存储桶存储内容。
如果您每次都创建temp
,这应该可以解决您的问题
var header = new unit();
header.records = csv.GetFieldHeaders;
unitlist.Add(header);
...
while (csv.ReadNextRecord())
{
var temp = new unit();
temp.records = new string[header.records.Length]
for (int i = 0; i < csv.Fieldcount; i++)
{
// Read the csv entry in the temp variable
temp.records[i] = csv[i];
}
// check for specific field, and write to list
if (temp.records[8] == "Ja")
unitlist.Add(temp);
}
答案 1 :(得分:0)
您需要在每次迭代中创建临时对象,如下所示。请试一试并检查。
while (csv.ReadNextRecord())
{
var temp = new unit();
temp.records = csv.GetFieldHeaders;
for (int i = 0; i < csv.Fieldcount; i++)
{
// Read the csv entry in the temp variable
temp.records[i] = csv[i];
}
// check for specific field, and write to list
if (temp.records[8] == "Ja")
unitlist.Add(temp);
}
答案 2 :(得分:0)
创建temp
变量时,它会引用内存中分配对象数据的位置。当您将其添加到unitlist
时,会将一个引用添加到指向内存中相同位置的列表中。
现在,当您更改temp.records[i]
时,它在同一内存位置已更新。因此,您最终会得到一个项目列表,这些项目都指向内存中的同一个对象,其中包含CSV文件中的最后一个records
。
在temp = new unit();
循环的开头简单地添加while
将导致每次迭代分配一个具有新内存位置的新对象,并temp
引用它。