关于此数据和(伪)代码:
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>();
}
答案 0 :(得分:6)
是的,List<T>
始终是引用。
您只需要用创建新列表替换.Clear()
。
DutyDayPeriods.Add(thisList);
//thisList.Clear();
thisList = new List<Period>();
答案 1 :(得分:1)
简短的回答是,您正在使用参考。答案越长越复杂。 C#处理简单类型(例如int
和char
)和按值构造结构,但类对象始终由引用处理。因此,当您使用thisList.Add
对象调用Period
时,实际上是在发送对该对象的引用。如果您真正想要的是值,则应执行以下操作:
DutyDayPeriods.Add(thisList);
thisList = new List<Period>();
这将从thisList
中取消引用thisList
上的所有内容,这意味着剩余的“活动”引用将位于您的其他集合中。