我有以下方法:
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);
}
并在此行使用它:
if (!GetTurns(possibleRoutes, secondLine).Item2)
{
//do something
}
每当它到达该点时,它就会将possibleRoutes
List传递给方法,并且每当从方法GetTurns
中声明的值中删除一个值时,列表就是引用类型 - localPossibleTurns
同样发生在possibleRoutes
列表中。如何避免这种情况并仅在我possibleRoutes
时更改possibleRoutes = GetTurns(possibleRoutes, secondLine).Item1;
的值?
答案 0 :(得分:3)
仅将其分配给新变量不会创建新列表。如果您需要副本,可以使用possibleTurns.ToList()
或更好new List<int>(possibleTurns)
。我更喜欢后者对于对象创建的可读性,并且因为有一天可能会改变ToList()的代码以获得性能提升,首先检查类型然后执行简单的转换。
public static List<T> ToList<T>(this IEnumerable<T> enumerable)
{
if (enumerable is List<T>)
return (List<T>) enumerable;
....
答案 1 :(得分:2)
您正在修改作为参数传入的集合。
您可以使用Linq ToList创建一个新的集合来处理方法:
List<int> localPossibleTurns = possibleTurns.ToList();