0

我想按第二列的内容(可以是“在线”或“离线”)对 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();
4

2 回答 2

1

您可以通过OrderBy方法使用 LINQ :

我想您列表中的用户来自 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 是他们的当前状态(在线、离线)

于 2012-06-27T20:56:37.543 回答
0

你的函数应该只包含一行:

return (a as ListViewItem).SubItems[0].Text.CompareTo((b as ListViewItem).SubItems[0].Text)
于 2012-06-27T21:00:43.403 回答