2016-04-05 17 views
1

Aşağıdaki yöntemi vardır:ile değerleri kaybetmemek için nasıl Liste en

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); 
} 

ve bu hat bunu kullanmakta:

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

o yöntem haline possibleRoutes listesi geçtiği noktaya ulaştığında ve GetTurns - localPossibleTurns yönteminde bildirilen değerden bir değer kaldırıldığında, liste, başvuru türü olduğu için possibleRoutes listesine de uygulanır. Bunu nasıl önleyebilirim ve possibleRoutes değerlerini yalnızca possibleRoutes = GetTurns(possibleRoutes, secondLine).Item1; yaptığımda nasıl değiştirebilirim?

+2

iyi tasarım değil. Eğer bir şeyi _get_mek istersem, orada hiçbir şeyin değiştirilmediğini sanmıyorum. –

+0

@TimSchmelter: Tam olarak engellemeye çalıştıkları şey bu. –

cevap

3

Sadece yeni bir değişkene atamak yeni bir liste oluşturmaz. Bir kopyasını istiyorsanız possibleTurns.ToList() veya daha iyi new List<int>(possibleTurns)'u kullanabilirsiniz. İkinci nesneyi, nesne oluşturma ile ilgili okunabilirlik için tercih ederim ve bir gün önce performansın kontrol edilmesi için ToList() kodunun türünü ilk önce denetlemek ve sonra basit bir yayın yapmak için değiştirebilir.

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

Bir parametre olarak aktarılan koleksiyonu değiştiriyorsunuz.

Sen Linq ToList kullanarak yöntemi içinde çalışmak için yeni bir koleksiyon oluşturabilirsiniz: Imo bir geçmiş listesi değiştiren bir `GetXY ...` yöntemi

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