В предыдущем посте я хотел заказать список строк (List<string>
). Теперь это работает нормально.
Теперь я хотел бы сделать еще один шаг и отсортировать список объектов, имея в качестве имени упомянутые строки.
Я думал, что это может быть легко:
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;
...
}
...
}
... и в другом файле сделайте что-то вроде:
...ToList().Sort(OwnObject.CompareTo);
Однако все не так просто: я получаю следующее сообщение компилятора:
Argument 1: cannot convert from 'method group' to 'System.Collections.Generic.IComparer<OwnObject>'.
Я думал, что делаю что-то похожее на CompareDinosByLength
с обучающего веб-сайта Microsoft.
Что я здесь делаю неправильно?
Если ваш OwnObject
уже реализует IComparable
(или IComparable<OwnObject>
), просто вызовите метод List<T>.Sort()
без параметров.
Если вы передаете метод Sort
, как в вашем примере, то он должен быть совместим с делегатом Comparison<T>, который ожидает два строго типизированных параметра. Вы можете использовать его, когда T
несопоставимо или сравнение по умолчанию не является предпочтительным:
// Custom sorting by name if OwnObject does NOT have a proper IComparable implementation
ownObjectsList.Sort((x, y) => x.Name.CompareTo(y.Name));
Примечание от автора вопроса:
ToList().Sort()
не имеет смысла: должно быть:
resulting_list = ....ToList();
resulting_list.Sort();
Sort()
— это метод void
, поэтому он не имеет возвращаемого значения. Сначала сохраните результат ToList
в переменной, затем вы можете вызвать Sort
для него. В качестве альтернативы вы можете использовать метод расширения OrderBy LINQ, который имеет возвращаемое значение, которое не изменяет исходный список, а возвращает новый перечисляемый экземпляр.
Я обновил ваш ответ соответственно. Иногда я спрашиваю себя, почему я делаю такие глупые ошибки :-)
Вам также необходимо реализовать общий IComparable<T>
, тогда вы можете ссылаться на эту функцию в Sort
.
Даже если вы полагаетесь на компаратор по умолчанию для автоматического вызова, вам все равно следует использовать его, так как он более эффективен.
public int CompareTo(OwnObject obj)
{
string s1 = this.Name;
string s2 = obj.Name;
...
}
Спасибо за замечание, но это уже было сделано.
Я начал так:
ToList().Sort();
, но это сгенерировало сообщение об ошибке компилятора «Невозможно неявно преобразовать тип 'void' в 'System.Collections.Generic.List<OwnObject>'».