【问题标题】:Multisorting using VB.net 2.0使用 VB.net 2.0 进行多重排序
【发布时间】:2013-06-25 19:50:20
【问题描述】:

我被 VB.net 2.0 困住了,我想对List(Of MyObject) 进行排序。我可以使用 LINQ 轻松做到这一点,但由于我过去只使用 Framwork 2.0,我必须说我真的不知道如何做到这一点。最好的方法是什么?

我可以有很多 SortFields,也可以没有...所有这些都是因为用户可以选择他想要排序的字段。

我对 IComparer 进行了很多搜索,但它只针对一个领域,而不是很多……如果我理解它是如何工作的。

我能做什么?

【问题讨论】:

    标签: .net vb.net sorting .net-2.0


    【解决方案1】:

    考虑创建一个进行比较的Comparer 方法。

    例如,创建一个使用两个字段的比较器:(这是在 C# 中,因为我的 VB 有点生疏):

    class MyCustomComparer: Comparer<MyObject>
    {
        public override int Compare(MyObject obj1, MyObject obj2)
        {
            int rslt = obj1.field1.CompareTo(obj2.field1);
            if (rslt != 0)
            {
                rslt = obj1.field2.CompareTo(obj2.field2);
            }
            return rslt;
        }
    }
    

    然后您可以创建其中一个对象并将其传递给采用比较函数的List.Sort 重载。

    当用户可以指定字段和排序顺序时,事情会变得有点复杂。我在pase中所做的是为每个可以比较的字段创建一个方法,例如:

    private int CompareField1(MyObject obj1, MyObject obj2)
    {
        return obj1.field1.CompareTo(obj2.field1);
    }
    
    private int CompareField2(MyObject obj1, MyObject obj2)
    {
        return obj1.field2.CompareTo(obj2.field2);
    }
    

    然后我在构造函数中创建了一个函数引用列表,一个用于用户指定的每个字段。它看起来像这样:

    private List<Func<MyObject, MyObject, int>> compares;
    
    public MyCustomComparer(List<int> fieldsToCompare)
    {
        compares = new List<Func<MyObject, MyObject, int>>();
        for (int i = 0; i < fieldsToCompare.Count; ++i)
        {
            switch (fieldsToCompare[i])
            {
                case 1: compares.Add(CompareField1); break;
                case 2: compares.Add(CompareField2); break;
                // other fields here
            }
        }
    }
    

    然后,您的 CompareTo 方法循环通过 compares 列表:

        public override int Compare(MyObject obj1, MyObject obj2)
        {
            for (int i = 0; i < compares.Count; ++i)
            {
                int rslt = compares[i](obj1, obj2);
                if (rslt != 0) return rslt;
            }
            return 0;
        }
    

    它不是特别漂亮,但它很有效。

    【讨论】:

    • 没问题,从技术上讲,我比 VB.net 更像一个 C# 程序员,但这些天我必须使用 VB.net。我看到了这一点,但知道可以使用 LINQ 执行.Orderby(function(f1) f1.MyField1).ThenBy(function(f2) f2.MyFields),我想知道在 2.0 中是否有最简单的方法来执行此操作。但似乎我别无选择。谢谢
    【解决方案2】:

    即使是 .NET 2.0 也有 List.Sort

    要按数据的多个字段排序,请调整比较器以按字段连续排序:如果第一个比较相等,则按第二个;如果相等,则按第三个;等等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2013-11-30
      • 2011-10-04
      相关资源
      最近更新 更多