C#列表中包含更改变量

时间:2018-03-15 09:27:28

标签: c# list override var

我有一个包含这样一个对象的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?

分开

3 个答案:

答案 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引用它。