You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过重写ListViewItemSorter为C# ListView排序IP地址

在C# ListView中实现IP地址排序的步骤

1. 调整比较器类适配ListView需求

你提供的IPComparer实现了泛型IComparer<string>,但ListView.ListViewItemSorter要求的是非泛型IComparer接口。可以通过两种方式适配:

方法一:直接修改原比较器类

internal class IPComparer : IComparer
{
    public int Compare(object x, object y)
    {
        if (x is not ListViewItem itemA || y is not ListViewItem itemB)
            return 0;

        // 假设IP地址在ListViewItem的第一个子项,根据实际列位置调整索引
        string ipA = itemA.SubItems[0].Text;
        string ipB = itemB.SubItems[0].Text;

        return Enumerable.Zip(ipA.Split('.'), ipB.Split('.'),
            (partA, partB) => int.Parse(partA).CompareTo(int.Parse(partB)))
            .FirstOrDefault(result => result != 0);
    }
}

方法二:保留原泛型比较器,新增适配类

如果不想改动原IPComparer,可以创建一个专门处理ListViewItem的适配类:

internal class ListViewIPComparer : IComparer
{
    private readonly IPComparer _ipComparer = new IPComparer();

    public int Compare(object x, object y)
    {
        if (x is not ListViewItem itemA || y is not ListViewItem itemB)
            return 0;

        string ipA = itemA.SubItems[0].Text;
        string ipB = itemB.SubItems[0].Text;

        return _ipComparer.Compare(ipA, ipB);
    }
}

2. 为ListView设置排序器并触发排序

在需要触发排序的逻辑中(比如列头点击事件、按钮点击事件),设置排序器并执行排序:

// 示例:列头点击时触发IP排序
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
    // 仅在点击IP所在列(示例为索引0)时执行IP排序
    if (e.Column == 0)
    {
        listView1.ListViewItemSorter = new IPComparer(); // 或new ListViewIPComparer()
        listView1.Sort();
    }
}

额外提示

  • 请根据IP地址实际所在的列,调整SubItems的索引值。
  • 如果需要支持升序/降序切换,可以在比较器类中添加SortDirection字段,在Compare方法中根据方向反转返回值。

内容的提问来源于stack exchange,提问作者Francesco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:48:14