如何避免丢失列表的值
How to avoid losing values with List's
我有以下方法:
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
列表传递给方法,因为只要从方法中声明的值中删除一个值,列表就是引用类型 GetTurns
- localPossibleTurns
possibleRoutes
列表也是如此。如何避免这种情况并仅在 possibleRoutes = GetTurns(possibleRoutes, secondLine).Item1;
时更改 possibleRoutes
的值?
仅仅将它分配给一个新变量并不会创建一个新列表。如果你想要一份副本,你可以使用 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;
....
您正在修改作为参数传入的集合。
您可以使用 Linq ToList 创建一个新集合以在方法内部使用:
List<int> localPossibleTurns = possibleTurns.ToList();
我有以下方法:
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
列表传递给方法,因为只要从方法中声明的值中删除一个值,列表就是引用类型 GetTurns
- localPossibleTurns
possibleRoutes
列表也是如此。如何避免这种情况并仅在 possibleRoutes = GetTurns(possibleRoutes, secondLine).Item1;
时更改 possibleRoutes
的值?
仅仅将它分配给一个新变量并不会创建一个新列表。如果你想要一份副本,你可以使用 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;
....
您正在修改作为参数传入的集合。
您可以使用 Linq ToList 创建一个新集合以在方法内部使用:
List<int> localPossibleTurns = possibleTurns.ToList();