我有一个班级Items
,我尝试对项目列表进行排序:
private static void Sort(Listitems) { . . . SortDesc(items); } private static void SortDesc(List items) { items = items.OrderByDescending(x => x.Neto).ToList(); }
当调试器输入时SortDesc()
,列表中的项目按排序Neto DESC
.当我继续并返回时Sort()
,列表回到我打电话之前的状态SortDesc()
.
该List
由裁判默认发送,所以为什么这不是工作?
谢谢!
您正在更改内存中items
使用以下代码行指向的引用:
items = items.OrderByDescending(x => x.Neto).ToList();
在调用SortDesc
方法时,列表对象通过引用传递.然后你正在创建新的列表.在此之后,您将其设置为items
参数.在此之后,items
指向新的引用,而不是前一个引用.但是,真实items
仍然指向旧的.
因此,您必须返回新创建的列表:
private static ListSortDesc(List items) { return items.OrderByDescending(x => x.Neto).ToList(); }
然后,只需在您的Sort
方法中设置它:
items = SortDesc(items);
PS:你也可以ref
明确地使用关键字来获得所需的结果,但实际上这不是首选方式.(...void SortDesc(ref List
).您可以从他对该问题的回答中读取 @JonSkeet的答案何时使用ref以及何时在C#中没有必要:
有用的答案:你几乎不需要使用ref/out.它基本上是一种获得另一个返回值的方法,通常应该被准确地避免,因为这意味着该方法可能试图做太多.