我有一个班级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>由裁判默认发送,所以为什么这不是工作?
谢谢!
您正在更改内存中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.它基本上是一种获得另一个返回值的方法,通常应该被准确地避免,因为这意味着该方法可能试图做太多.