[英]List<T> clearing in a For Loop unexpectedly
這個錯誤使我難過! 本質上,該代碼接收一個稱為“ Parking”的對象列表。 我想將具有相似Title
Parking
對象分組。 為此,我考慮過在列表中創建一個列表TerminalCollection
是一個Parking
對象的列表和一個供參考的名稱。
為了幫助我,我創建了一個新的-臨時- terminal
對象,該對象是Parking
對象的列表。 只要找到同一類別的“ Parking
對象,便將其添加到臨時terminal
直到找到不適合的對象。 發生這種情況時,我將terminal
列表與名稱結合起來以創建TerminalCollection
對象。 然后,我通過將下一批類似的Parking
對象添加到終端來重新開始該過程。
我發現的問題是,當我想在創建包含此列表副本的TerminalCollection
對象后清除terminal
列表時,也會從TerminalCollection
對象中清除該列表! 我不知道為什么,因為我認為自己正在創建一個新列表並為其分配terminal
副本? 為什么新列表與原始terminal
共享相同的內存? 是否有我誤解的基本概念? 非常感謝您提供幫助和建議來解決此問題! :)
private static List<TerminalCollection> Terminals(List<Parking> input)
{
List<TerminalCollection> Terminals = new List<TerminalCollection>();
List<Parking> terminal = new List<Parking>();
int current = 0;
int currentpos = 0;
string currentname = "";
bool clearbuffer = false;
foreach (Parking attempt in input)
{
if (clearbuffer)
{
terminal.Clear();
clearbuffer = false;
}
if (current != 0)
{
int checknew = int.Parse(Regex.Match(attempt.Title, @"\d+").Value);
if (checknew - current == 0 && Regex.Match(attempt.Title, @"\d+").Index == currentpos)
{
//Matches same terminal, so slot added in temporary terminal list
terminal.Add(attempt);
currentname = Regex.Match(attempt.Title, @"^.*?\d+").Value;
}
else
{
//Clears and starts again (resets current and currentpos)
current = checknew;
currentpos = Regex.Match(attempt.Title, @"\d+").Index;
TerminalCollection final = new TerminalCollection();
final.Slots = terminal;
final.Name = currentname;
//One terminal added to global collection of terminals
Terminals.Add(final);
//Temporary terminal list cleared
clearbuffer = true;
}
}
else {
//Gets first integer
current = int.Parse(Regex.Match(attempt.Title, @"\d+").Value);
currentpos = Regex.Match(attempt.Title, @"\d+").Index;
terminal.Clear();
//Adds first element to start a new terminal
terminal.Add(attempt);
}
}
return null;
}
Clear
不會創建新列表,分配也不會創建新列表。 在循環之前,您只創建一次列表,因此每個對象都將指向該列表。
您看到此清單是“其他”列表清除(實際上它們都是相同的列表)。
您需要更改為:
if (clearbuffer)
{
terminal = new List<Parking>();
clearbuffer = false;
}
現在,每個迭代將具有其自己的列表對象,並且您不會看到對它的更改影響其他實例。
總而言之,請考慮重新設計該循環,這確實令人困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.