簡體   English   中英

清單 <T> 在For循環中意外清除

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM