2016-03-29 5 views
0

Ich verwende ArrayList in C#, um einige Dinge zu tun. Ich habe 2 ArrayLists (align und am besten) und in einer bestimmten Zeit mache ich am besten = align innerhalb einer "für" Routine.C#: ArrayList.Clear() löscht das falsche Array

Das Problem ist, am Ende der Schleife, die ich ausrichten.Clear, aber in dieser Zeit wird auch das Array "beste" gelöscht. Nach der Schleife, wenn ich das Array "best" verwenden muss, bekomme ich Probleme, weil es gelöscht ist und ich versuche, auf seinen Index zuzugreifen.

Was ist das Problem? Hier

ist ein Stück von meinem Code:

public string AntColony() 
{ 
    ArrayList align = new ArrayList(); 
    ArrayList best = new ArrayList(); 

    for(int z=0;z<n_ants;z++) 
    { 
     //do the things i have to do 
     //full the array "align" with something (this will have two "adds", so, this array is a 2 lines array) 

     score = Score(align); 
     UpdatePhero(tao, path, score); 

     if (score > score_before) 
     { 
     score_before = score; 
     best = align; 
     } 
     align.Clear(); //clear the array align 
    } 
    string s = best[0].ToString() + "\r\n\r\n" + best[1].ToString() + "\r\n\r\n Number of matches: " + n_matches + "\r\n\r\n Score: " + score; 

    return s; 
} 

Thank you!

+1

Sie machen 'best' Verweis zu verweisen' align '. C# basiert auf Referenzen! –

+0

Danke für Ihre Antwort. Und was kann ich tun, um das zu lösen? Ich meine, welche Strategie? Wie auch immer, ich muss am besten ausrichten und am Ende ausrichten. –

+0

Ihre Anfrage wurde bereits von einem Autor in der Antwort beantwortet. Viel Glück. –

Antwort

2

Array-Variablen sind Referenztypen. Wenn Sie best=align anrufen Sie sind nicht Kopieren den Inhalt von align zu , Sie machen es so, dass sie auf den gleichen Ort verweisen, d. H. Sie verweisen auf den gleichen Speicherort.

Versuchen best=align.Clone()

+0

Vielen Dank für Ihre Antwort! Ich habe versucht, am besten zu tun = align.Clone(), aber ich habe etwas wie es ist nicht möglich, "Objekt" in "Convert.Collections.ArrayList" zu konvertieren. –

+0

Es funktionierte am besten = (ArrayList) align.Clone() Vielen Dank –

+0

Froh kann ich helfen! –

0

Da align ist nur vorübergehend, kann es nur vor dem Aufruf von Score und zugewiesen neu erstellt werden am besten bei Bedarf:

public string AntColony() 
{ 
    ArrayList best = null; 

    for(int z=0;z<n_ants;z++) 
    { 
     //do the things i have to do 
     //full the array "align" with something (this will have two "adds", so, this array is a 2 lines array) 

     ArrayList align = new ArrayList(); 
     score = Score(align); 
     UpdatePhero(tao, path, score); 

     if (score > score_before) 
     { 
     score_before = score; 
     best = align; 
     } 
    } 

    if (best != null) 
    { 
     string s = best[0].ToString() + "\r\n\r\n" + best[1].ToString() + "\r\n\r\n Number of matches: " + n_matches + "\r\n\r\n Score: " + score; 
     return s; 
    } 

    // TODO: Report failure here 

    return null; 
} 
+0

Danke für Ihre Antwort! Leider muss ich das Array vor der Schleife ausrichten, um einige andere Dinge zu tun! –