List.Add(x)。 x是参考还是值?

时间:2018-08-10 21:29:47

标签: c#

关于此数据和(伪)代码:

List<myClass> Periods = new List<myClass>();

// contents of Periods is:
Periods[0] = "000";
Periods[1] = "111";
Periods[2] = "222";
Periods[3] = "REST"; // REST PERIOD
Periods[4] = "444";
Periods[5] = "REST"; // REST PERIOD
Periods[6] = "666";
Periods[7] = "777";
Periods[8] = "888";

以下代码遍历该列表,并在REST期间将出现的多个列表元素提取到各个列表中,并将这些列表添加到“列表列表”中。休息时间之间可能有一个或多个列表条目。

List<List<Period>> DutyDayPeriods = new List<List<Period>>();
List<Period> thisList = new List<Period>();

for (int i = 0; i < Periods.Count; i++ ) {    
    thisList.Add(Periods[i]);

    if (Periods[i].Rest == "REST") {   
        DutyDayPeriods.Add(thisList);
        thisList.Clear();   
    }    
}

在for循环的底部,DutyDayPeriods <>包含1-n个“ thisList”的相同副本。本质上是最后一个休息时间和列表结尾之间的最后一组列表项:

所以,我期望以下几点:

DutyDayPeriods[0]
    Period 000
    Period 111
    Period 222
DutyDayPeriods[1]
    Period 444
DutyDayPeriods[2]
    Period 666
    Period 777
    Period 888

但是我实际上得到了:

DutyDayPeriods[0]
    Period 666
    Period 777
    Period 888
DutyDayPeriods[1]
    Period 666
    Period 777
    Period 888
DutyDayPeriods[2]
    Period 666
    Period 777
    Period 888

thisList的行为类似于引用,而不是

每次thisList更改时,似乎都会追溯更改为已添加到DutyDayPeriods的项目。

是这种情况吗?如果是这样,我该如何完成我想做的事情?

谢谢。

编辑:

我修改了以下内容,以防止将休息时间本身包括在内。以防万一你们注意到了。 ;-)

if (Periods[i].Rest != "REST") {
    thisList.Add(Periods[i]);
}
else {
    DutyDayFlights.Add(thisList);
    thisList = new List<Period>();  
}

2 个答案:

答案 0 :(得分:6)

是的,List<T>始终是引用。

您只需要用创建新列表替换.Clear()

DutyDayPeriods.Add(thisList);
//thisList.Clear();   
thisList = new List<Period>();

答案 1 :(得分:1)

简短的回答是,您正在使用参考。答案越长越复杂。 C#处理简单类型(例如intchar)和按值构造结构,但类对象始终由引用处理。因此,当您使用thisList.Add对象调用Period时,实际上是在发送对该对象的引用。如果您真正想要的是值,则应执行以下操作:

DutyDayPeriods.Add(thisList);
thisList = new List<Period>();

这将从thisList中取消引用thisList上的所有内容,这意味着剩余的“活动”引用将位于您的其他集合中。