簡體   English   中英

使用VB.net 2.0進行多重分類

[英]Multisorting using VB.net 2.0

我堅持使用VB.net 2.0,我想對List(Of MyObject)進行排序。 我可以使用LINQ輕松地做到這一點但是因為我過去只使用Framwork 2.0,我必須說我不知道​​如何做到這一點。 這樣做的最佳方法是什么?

我可以有很多SortFields以及沒有...這一切都是因為用戶可以選擇他想要排序的字段。

我搜索了很多關於IComparer但它只針對一個領域,而不是很多...如果我理解它是如何工作的。

我能做什么?

查看創建進行比較的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;
    }

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

甚至.NET 2.0都有List.Sort

為了按數據的多個字段排序,調整比較器以按字段連續排序:如果第一個比較相等,則按第二個; 如果相等,那就去第三個; 等等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM