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