0

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

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

我搜索了很多关于 IComparer 的内容,但它只针对一个领域,而不是很多……如果我很好地理解它是如何工作的。

我能做些什么?

4

2 回答 2

2

研究创建一个进行比较的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;
    }

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

于 2013-06-25T19:58:49.180 回答
0

甚至 .NET 2.0 也有List.Sort.

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

于 2013-06-25T19:56:23.993 回答