Сортировка Windows.Forms.ListView по второму столбцу

Я хочу отсортировать элементы ListView по содержимому второго столбца (который может быть «в сети» или «вне сети»). Сортировка будет выполняться только в одном конкретном месте кода, поэтому решение не должно быть гибким. Более того, он должен быть прост в реализации и не требовать серьезных изменений в остальной части приложения.

Я попытался создать класс, реализующий IComparer, и присвоить его listView.ListViewItemSorter, но у меня это не работает.

Пример кода:

class ChannelSorter : System.Collections.IComparer
{
    public int Compare(object a, object b)
    {
        if ((a as ListViewItem).SubItems[0].Text.CompareTo("Online") == 0)
            if ((b as ListViewItem).SubItems[0].Text.CompareTo("Online") == 0)
                return 0;
            else
                return -1;
        else if ((b as ListViewItem).SubItems[0].Text.CompareTo("Online") == 0)
            return 1;
        else
            return 0;
    }
}


// in constructor of Form1
listView1.ListViewItemSorter = new ChannelSorter();

person Xirdus    schedule 27.06.2012    source источник
comment
Вы забыли (пере)назначить свойство Sorting.   -  person Hans Passant    schedule 28.06.2012


Ответы (2)


Вы можете использовать LINQ с методом OrderBy. :

Я предполагаю, что ваши пользователи в списке происходят из массива User[] или списка или любого Enumerable. Затем вы просто используете метод OrderBY, чтобы получить новый упорядоченный список:

var currentUsers = new List<User>();
// Fill your users
// Super happy fun sorting time!
var sortedUsers = currentUsers.OrderBy(user => user.State);

Где user.State — их текущее состояние (в сети, в автономном режиме).

person pikzen    schedule 27.06.2012
comment
Пользователи... Почему вы решили, что это о пользователях? ;) Во всяком случае, это работает. Большое спасибо! - person Xirdus; 28.06.2012
comment
Я бы предложил Пингвинов или Серверов, но мне понравилась человеческая сторона вопроса :) - person pikzen; 28.06.2012

Ваша функция должна содержать только одну строку:

return (a as ListViewItem).SubItems[0].Text.CompareTo((b as ListViewItem).SubItems[0].Text)
person Dusan    schedule 27.06.2012