C# 为什么这种非常常见的排序方法不能对我的列表进行排序?

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.

我试图对一个名为Sales的对象列表进行排序,但似乎每个人都使用的方法对我来说都没有正确排序。下面的代码是对列表进行排序的类,但是当我在单元测试中打印“排序”列表时,它显示它根本没有被排序

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