Как мне разрешить передать метод List.Sort ()? - PullRequest
1 голос
/ 10 января 2012

я звоню Sort на List:

List<Stuff> list = new List<Stuff>();
list.Sort(StuffSortByName);

с объявлением StuffSortByName:

private static int StuffSortByName(Stuff x, Stuff y)
{
    ...
}

Что меня удивляет, так это то, что мой код компилируется и работает. Удивительно, что перегрузка Sort не требует метода:

Так что мне повезло, так как я не хотел создавать целый объект, который реализует IComparer, просто для сортировки. Но что касается меня, я не понимаю, пока он собирается.


А теперь я хочу повторить эту магию. Я хочу отсортировать ListView. Но вы не сортируете список рассылки, вы предоставляете списку IComparer через его ListViewItemSorter свойство:

listView1.ListViewItemSorter = [IComparer]

И, опять же, я не хочу писать целый объект, я просто хочу передать локальный метод (и в идеале нестатический):

listView1.ListViewItemSorter = SortListView;


private static int SortListView(Object x, Object y)
{
    ....
}

Теперь, конечно, это не компилируется, потому что это не имеет смысла. Но тогда более ранний синтаксис также не должен компилироваться - но это так.

Так что это дает мне надежду, что у меня может быть такой же запутанный синтаксис здесь.

Как мне было разрешено передавать метод в качестве средства сравнения сортировки в первом случае, но не во втором?

Ответы [ 2 ]

4 голосов
/ 10 января 2012

Чтобы ответить на ваш первый вопрос, причина, по которой имя метода может быть передано, состоит в том, что Comparison<T> является типом делегата, то есть это тип, представляющий сигнатуру метода.Подробнее см. MSDN .

В вашем случае вам следует либо создать объект IComparer, либо ваш объект Stuff реализует IComparable или IComparable<T> (если это возможно).

0 голосов
/ 10 января 2012

Я думаю, вы просто используете эту перегрузку .который использует Сравнение

По ссылке:

Если сравнение предоставлено, элементы списка (Of T) сортируются с использованием метода, представленного делегатом

РЕДАКТИРОВАТЬ

Как насчет ListView, как вы заметили, он реализует IComparer и не Comparison,так что вы не можете просто передать ему делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...