如何避免丢失列表的值

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