C# 如何使用列表避免丢失值';s

C# 如何使用列表避免丢失值';s,c#,methods,reference,tuples,reference-type,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 (

我有以下方法:

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

无论何时到达该点,它都会将
possibleRoutes
列表传递到该方法中,并且由于每当从方法
GetTurns
-
localPossibleTurns
中声明的值中移除值时,列表都是引用类型,因此
possibleRoutes
列表也会发生同样的情况。只有当我执行
possibleRoutes=GetTurns(possibleRoutes,secondLine)时,我才能避免这种情况并更改
possibleRoutes
的值

仅将其分配给新变量不会创建新列表。如果需要副本,可以使用
possibleTurns.ToList()
或更好的
新列表(possibleTurns)
。对于对象创建的可读性,我更喜欢后者,因为有一天,为了提高性能,可能会更改ToList()的代码,首先检查类型,然后执行简单的强制转换

public static List<T> ToList<T>(this IEnumerable<T> enumerable)
{
    if (enumerable is List<T>)
        return (List<T>) enumerable;
    ....
公共静态列表列表(此IEnumerable可枚举)
{
if(可枚举为列表)
返回(列表)可枚举;
....

仅仅将其分配给一个新变量并不会创建一个新的列表。如果您想要一个副本,可以使用
possibleTurns.ToList()
或更好的
new list(possibleTurns)
。我更喜欢后者,因为有一天它可能会更改ToList()的代码为了提高性能,请首先检查类型,然后执行简单的强制转换

public static List<T> ToList<T>(this IEnumerable<T> enumerable)
{
    if (enumerable is List<T>)
        return (List<T>) enumerable;
    ....
公共静态列表列表(此IEnumerable可枚举)
{
if(可枚举为列表)
返回(列表)可枚举;
....

您正在修改作为参数传入的集合

您可以使用Linq ToList在方法内部创建一个新集合:

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

您正在修改作为参数传入的集合

您可以使用Linq ToList在方法内部创建一个新集合:

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

Imo a
GetXY…
修改已传递列表的方法是不好的设计。如果我想得到一些东西,我不希望那里有任何东西被修改。@TimSchmelter:这正是他们试图阻止的。Imo a
GetXY…
修改已传递列表的方法是不好的设计。如果我想得到一些我不希望得到的东西任何东西都被修改了。@TimSchmelter:这正是他们试图阻止的。