List<T> 在 For 循环中意外清除
List<T> clearing in a For Loop unexpectedly
这个错误难倒了我!本质上,该代码接收一个名为 "Parking" 的对象列表。我想将 Parking
个具有相似 Title
的对象分组。为此,我考虑过在列表中创建一个列表 - 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
不会 创建一个新列表,赋值也不会。您只在循环之前创建列表一次,因此 每个 对象都会指向它。
您将此清单视为 "other" 列表清理(实际上它们都是相同的列表)。
你需要改成这样:
if (clearbuffer)
{
terminal = new List<Parking>();
clearbuffer = false;
}
现在每次迭代都会有自己的列表对象,您不会看到对它的更改会影响其他实例。
总的来说,考虑重新设计那个循环,它真的令人困惑。
这个错误难倒了我!本质上,该代码接收一个名为 "Parking" 的对象列表。我想将 Parking
个具有相似 Title
的对象分组。为此,我考虑过在列表中创建一个列表 - 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
不会 创建一个新列表,赋值也不会。您只在循环之前创建列表一次,因此 每个 对象都会指向它。
您将此清单视为 "other" 列表清理(实际上它们都是相同的列表)。
你需要改成这样:
if (clearbuffer)
{
terminal = new List<Parking>();
clearbuffer = false;
}
现在每次迭代都会有自己的列表对象,您不会看到对它的更改会影响其他实例。
总的来说,考虑重新设计那个循环,它真的令人困惑。