2016-04-05 5 views
1

zu verlieren Ich habe die folgende Methode:Wie kann man vermeiden Werte mit List

private static Tuple<List<int>, bool> GetTurns(List<int> possibleTurns, IList<int> currentLine) 
{ 
    List<int> localPossibleTurns = possibleTurns; 

    foreach (var passedTurn in passedTurns) 
    { 
     for (int j = 0; j < localPossibleTurns.Count; j++) 
     { 
      int indexOfNewNumber = currentLine.IndexOf(localPossibleTurns[j]); 

      if (localPossibleTurns[j] == passedTurn.Item1) 
      { 
       if (indexOfNewNumber + 1 == passedTurn.Item2 || indexOfNewNumber == passedTurn.Item2) 
       { 
        localPossibleTurns.RemoveAt(j); 
       } 
      } 
     } 
    } 

    return localPossibleTurns.Count == 0 
      ? new Tuple<List<int>, bool>(localPossibleTurns, false) 
      : new Tuple<List<int>, bool>(localPossibleTurns, true); 
} 

und es in dieser Zeile mit:

if (!GetTurns(possibleRoutes, secondLine).Item2) 
{ 
    //do something 
} 

, wenn es diesen Punkt erreicht er die possibleRoutes Liste in das Verfahren geht und da die Liste der Referenztyp ist, wann immer ein Wert von dem in der Methode GetTurns - localPossibleTurns deklarierten entfernt wird, geschieht dasselbe mit der possibleRoutes Liste. Wie kann ich das vermeiden und die Werte von possibleRoutes nur ändern, wenn ich possibleRoutes = GetTurns(possibleRoutes, secondLine).Item1; mache?

+2

Imo eine 'GetXY ...' Methode, die eine übergebenen Liste ändert, ist nicht ein gutes Design. Wenn ich etwas _get_ etwas will, erwarte ich nicht, dass dort irgendetwas geändert wird. –

+0

@TimSchmelter: Genau das versuchen sie zu verhindern. –

Antwort

3

Wenn Sie es nur einer neuen Variablen zuweisen, wird keine neue Liste erstellt. Wenn Sie eine Kopie möchten, können Sie possibleTurns.ToList() oder besser new List<int>(possibleTurns) verwenden. Ich bevorzuge Letzteres für die Lesbarkeit in Bezug auf die Objekterstellung, und weil eines Tages möglicherweise der Code von ToList() für Leistungsgewinne geändert wird, um zuerst den Typ zu prüfen und dann eine einfache Umwandlung durchzuführen.

public static List<T> ToList<T>(this IEnumerable<T> enumerable) 
{ 
    if (enumerable is List<T>) 
     return (List<T>) enumerable; 
    .... 
2

Sie ändern die als Parameter übergebene Sammlung.

Sie können eine neue Sammlung erstellen mit in der Methode unter Verwendung von Linq ToList zu arbeiten:

List<int> localPossibleTurns = possibleTurns.ToList(); 
Verwandte Themen