Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表中没有';方法C中的t变化#_C#_.net - Fatal编程技术网

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);
}