C# 为什么这种非常常见的排序方法不能对我的列表进行排序?
我试图对一个名为Sales的对象列表进行排序,但似乎每个人都使用的方法对我来说都没有正确排序。下面的代码是对列表进行排序的类,但是当我在单元测试中打印“排序”列表时,它显示它根本没有被排序C# 为什么这种非常常见的排序方法不能对我的列表进行排序?,c#,visual-studio,C#,Visual Studio,我试图对一个名为Sales的对象列表进行排序,但似乎每个人都使用的方法对我来说都没有正确排序。下面的代码是对列表进行排序的类,但是当我在单元测试中打印“排序”列表时,它显示它根本没有被排序 using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace ConsoleApplication1
{
/// <summary>
/// This class modifies an array of all of the sales in order to
manipulate the order and contents
/// which will then print out onto the excel document.
/// </summary>
public class Modifier
{
public List<Sales> salesList;
/// <summary>
/// This is the constructor for the Modifier object.
/// </summary>
/// <param name="sales"> Takes the list of all of the sales objects
created. </param>
public Modifier(List<Sales> list)
{
salesList = list;
}
/// <summary>
/// This method is called by Main to perform all operations within
this class.
/// </summary>
/// <returns> Returns true if exits correctly. </returns>
public void execute()
{
deleteTJ();
deleteFifteens();
Console.WriteLine("List contains count: " +
salesList.Count.ToString());
sortMaterial();
public void sortMaterial()
{
salesList = salesList.OrderBy(o => o.material).ToList();
}
这里的问题是,您似乎不理解C#中的引用是如何工作的。这与范围无关 引用类型是一种占位符类型,它指向在其他位置的一组实际数据 因此,首先使用
testList
变量,它指向某个地方的列表对象:
testList -----> [List]
然后将其传递到修饰符的构造函数中,修饰符有一个名为salesList
的字段,它将传入的引用分配给该字段。现在testList
和salesList
正在引用相同的列表:
testList -----> [List]
^
salesList /
然后调用sortMaterial()
,它使用OrderBy
OrderBy
保持原始列表不变,并返回一个IEnumerable
,从中创建一个新列表,分配给salesList
,因此现在testList
和salesList
参考不同的列表:
到目前为止,原始列表保持不变,这就是为什么您看到了您看到的结果
您可以让代码按照您想要的方式工作,而不是使用保持原始列表不变的方法。但如今,人们往往在不必要的时候避免修改对象。因此,我建议更改sortMaterial
,使其返回排序列表:
public List<Sales> sortMaterial()
{
salesList = salesList.OrderBy(o => o.material).ToList();
return salesList;
}
您的代码不应该像您期望的那样工作。该代码怎么办?您是否尝试过
salesList=salesList.OrderBy(s=>s.material)
?请注意,我的注释分配了从OrderBy()返回的值,您是在告诉我您的代码不工作,即使在分配了OrderBy()返回的值之后?@AlexBochel看看这个,它说明了我在说什么。@maccettura哇,非常感谢你!我真的很感谢你的耐心和帮助。
testList ----> [original list]
salesList ----> [sorted list]
public List<Sales> sortMaterial()
{
salesList = salesList.OrderBy(o => o.material).ToList();
return salesList;
}
testList = modifier.sortMaterial();