How to sort a list of objects with IComparable and IComparer

Max*_*mus 2 c# sorting list icomparable icomparer

I'm trying to implement the same example of this link but more oriented on the number of dependent kids.

http://www.codeproject.com/Articles/42839/Sorting-Lists-using-IComparable-and-IComparer-Inte

So I have 3 employees with A: 0, B: 0, C: 2 respectively. I want to order them descendently by number of kids. So I would have C:2, B:0, A:0

But my list it's not being sorted. It remains as A: 0, B: 0, C: 2

What I'm doing wrong?

My Comparer

public class EmployeeComparer : IComparer<Employee>
{
    public int Compare(Employee x, Employee y)
    {
        this.CompareNumberOfKids(x, y);
    }

    public int CompareNumberOfKids(Employee x, Employee y)
    {
        if (x.NumberOfKids > y.NumberOfKids)
        {
            return -1;
        }
        else if (x.NumberOfKids < y.NumberOfKids)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

My Business Entity

public class Employee : IComparable<Employee>
{
    //...//
    Public NumberOfKids { get; set; }

    int IComparable<Employee>.CompareTo(Employee next)
    {
        return new EmployeeComparer().Compare(this, next);
    }

    public override bool Equals(object obj)
    {
        if (obj != null && obj is Emmployee)
        {
            return ((Employee)obj).ID.Equals(this.ID);
        }
        else return base.Equals(obj);
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

Aspx.cs

public List<Employee> GetEmployeeSortedList()
{
    List<Employee> list = new List<Employee>();
    list.Add(new Employee() { Name = "A", NumberOfKids = 0 } );
    list.Add(new Employee() { Name = "B", NumberOfKids = 0 } );
    list.Add(new Employee() { Name = "C", NumberOfKids = 2 } );
    list.Add(new Employee() { Name = "D", NumberOfKids = 1 } );
    list.Add(new Employee() { Name = "E", NumberOfKids = 0 } );
    list.Add(new Employee() { Name = "F", NumberOfKids = 4 } );

    list = list.Take(3).ToList();
    EmployeeComparer comp = new EmployeeComparer();
    list.Sort(comp);
    return list;
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*hel 5

首先,IComparer<Employee>如果您的EmployeeIComparable<Employee>使用相同的排序条件来实现,则无需按降序进行排序。对于您的Employee班级来说,IComparer<Employee>为每个比较实例化一个新实例的效率非常低下。

您应该更改您的Employee课程,使其CompareTo外观如下所示:

int CompareTo(Employee next)
{
    return next.NumberOfKids.CompareTo(this.NumberOfKids);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以EmployeeComparer完全放弃并进行如下排序:

list = list.Take(3).ToList();
list.Sort();  // Uses default IComparable for the Employee class
return list;
Run Code Online (Sandbox Code Playgroud)

通常,使IComparable<T>类上的实现执行默认的排序顺序。对于员工而言,可能是按员工ID或姓氏,名字。IComparer<T>实现应用于其他排序标准。

List<T>不过,有了,您还有另一个选择:使用匿名函数。例如,您可以这样编写:

list.Sort((x, y) => y.NumberOfKids.CompareTo(x.NumberOfKids));
Run Code Online (Sandbox Code Playgroud)

请参阅此List.Sort超载

或者,你可以只沟的整体思路IComparer<T>IComparable<T>List.Sort干脆做的LINQ方式:

var result = list.Take(3).OrderByDescending(x => x.NumberOfKids).ToList();
Run Code Online (Sandbox Code Playgroud)