如何避免使用List's丢失值

时间:2016-04-05 13:09:18

标签: c# methods reference tuples reference-type

我有以下方法:

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;的值?

2 个答案:

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