C# 列表中没有';方法C中的t变化#
我有一个类C# 列表中没有';方法C中的t变化#,c#,.net,C#,.net,我有一个类项目,我尝试对项目列表进行排序: private static void Sort(List<Items> items) { . . . SortDesc(items); } private static void SortDesc(List<Items> items) { items = items.OrderByDescending(x => x.Neto).ToList(); } 私有静态无效排序(列表项) { . . . SortDe
项目
,我尝试对项目列表进行排序:
private static void Sort(List<Items> items)
{
.
.
.
SortDesc(items);
}
private static void SortDesc(List<Items> items)
{
items = items.OrderByDescending(x => x.Neto).ToList();
}
私有静态无效排序(列表项)
{
.
.
.
SortDesc(项目);
}
私有静态void SortDesc(列表项)
{
items=items.OrderByDescending(x=>x.Neto.ToList();
}
当调试器在SortDesc()
中运行时,列表中的项目按Neto DESC
排序。当我继续并返回到Sort()
时,列表返回到调用SortDesc()
之前的状态
默认情况下,列表
通过ref发送,那么为什么这不起作用呢
谢谢 您正在更改内存中的引用,
项
用这行代码指向该引用:
items = items.OrderByDescending(x => x.Neto).ToList();
调用SortDesc
方法时,列表对象通过引用传递。然后创建新的列表。在此之后,将其设置为items
参数。在此之后,items
指向新的引用,而不是前一个引用。但是,真正的项仍然指向旧项
因此,您必须返回新创建的列表:
private static List<Items> SortDesc(List<Items> items)
{
return items.OrderByDescending(x => x.Neto).ToList();
}
p.S:您也可以显式使用ref
关键字来获得所需的结果,但实际上这不是首选方法。(…作废SortDesc(参考列表项)
)。
你可以从他对那个问题的回答中读到答案:
有用的回答:几乎不需要使用ref/out。它基本上是一个
获取另一个返回值的方法,通常应避免
正是因为这意味着该方法可能也在尝试
很多
您需要退回订购的物品
private static List<Items> SortFromTheHighPriceToLowPriceByNeto(List<Items> items)
{
items = items.OrderByDescending(x => x.Neto).ToList();
return items;
}
从HighPrice到LowPriceByNeto的私有静态列表排序(列表项)
{
items=items.OrderByDescending(x=>x.Neto.ToList();
退货项目;
}
调用SortDesc
时,将原始项的引用副本传递给方法。因此,在重新分配项
的方法中,将新引用分配给原始引用的副本,而不是原始引用本身。原始引用保持不变
为了更新原始引用,您需要通过引用传递项。这样做:
private static void SortDesc(ref List<Items> items)
{
items = items.OrderByDescending(x => x.Neto).ToList();
}
private static void SortDesc(List<Items> items)
{
items.Sort((x, y) => y.Neto.CompareTo(x.Neto)); // unstable
}
private static void SortDesc(参考列表项)
{
items=items.OrderByDescending(x=>x.Neto.ToList();
}
如果这样做,调用将变成SortDesc(ref items)
。这将如预期的那样起作用
默认情况下,列表
通过ref发送,那么为什么这不起作用呢
不,所有没有特别标记的参数都是通过值传递的(它适用于引用类型和值类型)。如果您将方法更改为ref
,它将起作用:
private static void SortDesc(ref List<Items> items)
{
items = items.OrderByDescending(x => x.Neto).ToList();
}
但是,由于您使方法无效
,您可能希望对同一个列表进行排序,而不是创建另一个列表
在这种情况下,有一些可能性。一种是使用列表
上的排序
方法,如下所示:
private static void SortDesc(ref List<Items> items)
{
items = items.OrderByDescending(x => x.Neto).ToList();
}
private static void SortDesc(List<Items> items)
{
items.Sort((x, y) => y.Neto.CompareTo(x.Neto)); // unstable
}
除了Clear
和AddRange
之外,您还可以使用包含items[i]=templast[i]
的for
循环显式复制列表项:)@Sajeetharan没有问题。这种情况在中国经常发生。:)@法哈德·贾比耶夫,为什么真实物品和旧物品之间存在差异?是不是不一样?@OrK-对列表的引用和对列表中项目的引用之间存在差异。创建新列表时,其中的项目可以与原始列表的顺序不同,因为SortDesc
方法中的“项目”不是排序方法中的items
。这只是一个参考。尝试将项的名称更改为inputList
,然后重新考虑。通过items=…
行,您正在告诉SortDesc
中的items
必须指向另一个引用。但是真正的项目仍然指向旧的参考。@HenkHolterman-为什么?这种方法本身有点反常。最好将此方法的内部代码移到调用代码中。@HenkHolterman-在本例中,OP将处理按值传递引用和按引用传递引用之间的差异。如果他能够理解这种区别,那么他应该能够理解为什么这可能不是最佳实践。
private static void SortDesc(List<Items> items)
{
items.Sort((x, y) => Comparer<Xxx>.Default.Compare(y.Neto, x.Neto)); // unstable
}
private static void SortDesc(List<Items> items)
{
var tempList = items.OrderByDescending(x => x.Neto).ToList();
items.Clear();
items.AddRange(tempList);
}