列表在方法C#中没有变化

Or *_*r K 0 .net c#

我有一个班级Items,我尝试对项目列表进行排序:

private static void Sort(List<Items> items)
{
.
.
.
   SortDesc(items);
}

private static void SortDesc(List<Items> items)
{
  items = items.OrderByDescending(x => x.Neto).ToList();
}
Run Code Online (Sandbox Code Playgroud)

当调试器输入时SortDesc(),列表中的项目按排序Neto DESC.当我继续并返回时Sort(),列表回到我打电话之前的状态SortDesc().

List<T>由裁判默认发送,所以为什么这不是工作?

谢谢!

Far*_*yev 7

您正在更改内存中items使用以下代码行指向的引用:

 items = items.OrderByDescending(x => x.Neto).ToList();
Run Code Online (Sandbox Code Playgroud)

在调用SortDesc方法时,列表对象通过引用传递.然后你正在创建新的列表.在此之后,您将其设置为items参数.在此之后,items指向新的引用,而不是前一个引用.但是,真实items仍然指向旧的.

因此,您必须返回新创建的列表:

private static List<Items> SortDesc(List<Items> items)
{
  return items.OrderByDescending(x => x.Neto).ToList();
}
Run Code Online (Sandbox Code Playgroud)

然后,只需在您的Sort方法中设置它:

items = SortDesc(items);
Run Code Online (Sandbox Code Playgroud)

PS:你也可以ref明确地使用关键字来获得所需的结果,但实际上这不是首选方式.(...void SortDesc(ref List<Items> items)).您可以从他对该问题的回答中读取 @JonSkeet的答案何时使用ref以及何时在C#中没有必要:

有用的答案:你几乎不需要使用ref/out.它基本上是一种获得另一个返回值的方法,通常应该被准确地避免,因为这意味着该方法可能试图做太多.