How to use custom sorting, based on the "Sort()" method of List<OwnObject>

72 Views Asked by At

In a previous post, I wanted to custom order a list of strings (List<string>). This is working fine now.

Now I would like a step further and sort a list of objects, having the mentioned strings as their name.

I thought this might be easy:

public class OwnObject : IComparable
    public int CompareTo(object obj)
    {
        if (!(obj is OwnObject)) return 0;

        string s1 = this.Name;
        string s2 = (obj as OwnObject).Name;
        ...
    }
    ...
}

... and in another file, do something like:

...ToList().Sort(OwnObject.CompareTo);

However, it's not that simple: I get the following compiler message:

Argument 1: cannot convert from 'method group' to 'System.Collections.Generic.IComparer<OwnObject>'.

I thought I was doing something similar like the CompareDinosByLength from the Microsoft learning website.

What am I doing wrong here?

2

There are 2 best solutions below

3
György Kőszeg On BEST ANSWER

If your OwnObject already implements IComparable (or IComparable<OwnObject>, then simply call the parameterless List<T>.Sort() method.

If you pass a method to Sort like in your example, then it must be compatible with the Comparison<T> delegate, which expects two strongly typed parameters. You can use it when T is not comparable or the default comparison is not preferable:

// Custom sorting by name if OwnObject does NOT have a proper IComparable implementation
ownObjectsList.Sort((x, y) => x.Name.CompareTo(y.Name));

Remark from the question author:

ToList().Sort() makes no sense: it should be:

resulting_list = ....ToList();
resulting_list.Sort();
1
Charlieface On

You need to implement the generic IComparable<T> also, then you can refer to that function in the Sort.

Even if you rely on the default comparer to call it automatically, you should still use this as it's more efficient.

public int CompareTo(OwnObject obj)
{
    string s1 = this.Name;
    string s2 = obj.Name;
    ...
}