2013-06-25 26 views
0

我被困在VB.net 2.0中,我想排序List(Of MyObject)。我可以很容易地使用LINQ,但是因爲我回到過去只使用Framwork 2.0,我必須說我不知道​​如何做到這一點。什麼是最好的方法來做到這一點?使用VB.net 2.0的多處理器

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

我搜索了很多有關的IComparer但只做到這一點對一個領域,沒有多少......如果我充分理解它是如何工作的。

我該怎麼辦?

回答

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; 
    } 

這不是特別漂亮,但它是相當有效的。

+0

沒問題,我在技術上更具C#程序員比VB.net,但必須與VB.net這些天的工作。我看到了這一點,但知道這是可以做到的了'.Orderby(函數(F1)f1.MyField1).ThenBy(函數(F2)f2.MyFields)'使用LINQ,我想知道是否有這樣做的最簡單的方法在2.0中。但似乎我沒有別的選擇。謝謝 –

0

即使.NET 2.0也有List.Sort

爲了通過數據的多個字段進行排序,適應比較器由場連續進行排序:如果第一個比較是相等的,由第二去;如果那是平等的,那就走第三條;等等。