Orderby 不调用所提供比较器的 Compare()



谁能解释为什么。net框架不调用比较器的比较方法,当我使用Enumerable.OrderBy。然而,当我使用list。sort()时,它确实会被调用。

//下面的代码取自StackOverFlow.com上的另一篇文章

class Employee
{
    public string Name { get; set; }
    public int Salary { get; set; }
}

class Employee_SortBySalaryByAscendingOrder : IComparer<Employee>
{
    #region IComparer<Employee> Members
    public int Compare(Employee x, Employee y)
    {
        if (x.Salary > y.Salary) return 1;
        else if (x.Salary < y.Salary) return -1;
        else return 0;
    }
    #endregion
}

    private void TestSort(object sender, EventArgs e)
    {
        List<Employee> empList = new List<Employee>() 
                                {       
                                    new Employee { Name = "a", Salary = 14000 },
                                    new Employee { Name = "b", Salary = 13000 } 
                                };
        Employee_SortBySalaryByAscendingOrder eAsc = 
                    new Employee_SortBySalaryByAscendingOrder();
        // Sort Employees by salary by ascending order.   
        // Does not work
        IOrderedEnumerable<Employee> orderedEmployees = empList.OrderBy(x => x, eAsc);
        // Works
        empList.Sort(eAsc);
    }

它不起作用,因为您实际上没有评估orderedEmployees序列。您需要使用ToListToArray强制求值。

Linq使用延迟执行,因此在

中定义排序查询:
IOrderedEnumerable<Employee> orderedEmployees = empList.OrderBy(x => x, eAsc);

不做任何实际排序输入序列的工作。只有当您尝试使用查询结果时,才会进行排序。

最新更新