2010-01-27 49 views
4

我有以下代碼:通用排序<T>

public class OMyObject 
    { 
     public int Id { get; set; } 
     public string Value { get; set; } 
     public DateTime? MyDate { get; set; } 
    } 

我也有這樣的代碼:

public static class ObjectExtension 
{ 
    public static List<OMyObject> Sort<T>(this List<OMyObject> o, Func<OMyObject, T> keySort, ESortDirection direction) where T : IComparable 
    { 
     if (direction == ESortDirection.asc) 
     { 
      o.Sort((a, b) => keySort(a).CompareTo(keySort(b))); 
     } 
     else 
     { 
      o.Sort((a, b) => keySort(b).CompareTo(keySort(a))); 
     } 
     return o; 
    } 

} 

現在我有一個測試控制檯應用程序,它具有以下功能:

var myObjectList = new List<OMyObject> 
           { 
            new OMyObject {Id = 4, MyDate = DateTime.Now.AddDays(4), Value = "Test 4"}, 
            new OMyObject {Id = 2, MyDate = DateTime.Now.AddDays(2), Value = "Test 2"}, 
            new OMyObject {Id = 1, MyDate = DateTime.Now.AddDays(1), Value = "Test 1"}, 
            new OMyObject {Id = 3, MyDate = DateTime.Now.AddDays(3), Value = "Test 3"}, 

           }; 


     Console.WriteLine("Sort By Nullable Date ASC"); 

     myObjectList.Sort(id => (DateTime)id.MyDate, ESortDirection.asc); 

     foreach (var item in myObjectList) 
     { 
      Console.WriteLine(item.Id + " - " + item.MyDate + " - " + item.Value); 
     } 
     Console.WriteLine("Sort By ID DESC"); 
     myObjectList.Sort(id => id.Id, ESortDirection.desc); 

     foreach (var item in myObjectList) 
     { 
      Console.WriteLine(item.Id + " - " + item.MyDate + " - " + item.Value); 
     } 

     Console.ReadLine(); 

所以你可以看到我正在傳遞一個屬性來排序。

問題是這樣的:

我怎樣才能讓我的排序()擴展方法一般能在任何列表對象傳遞給排序?

因此,如果我創建了一個OMySecondObject,我想使用相同的方法進行排序。

我試圖用List<T>List<object>替換List<OMyObject>,但這不起作用。

有什麼想法?

讓我知道你是否需要進一步澄清我正在嘗試做什麼。

感謝

UPDATE:解決方案

好吧根據我的討論和提供的答案(非常感謝你給大家誰回答)我已經想通了一個更簡單的方法來做到這一點。

我有這樣的方法來模擬數據庫調用:

public static IEnumerable<OMyObject> GetObject() 
     { 
      var myObjectList = new List<OMyObject> 
            { 
             new OMyObject {Id = 4, MyDate = DateTime.Now.AddDays(4), Value = "Test 4"}, 
             new OMyObject {Id = 2, MyDate = DateTime.Now.AddDays(2), Value = "Test 2"}, 
             new OMyObject {Id = 1, MyDate = DateTime.Now.AddDays(1), Value = "Test 1"}, 
             new OMyObject {Id = 3, MyDate = DateTime.Now.AddDays(3), Value = "Test 3"}, 

            }; 
      return myObjectList; 
     } 

然後我只是有點這個名單如下:

IEnumerable<OMyObject> myObjectList = GetObject(); 
    myObjectList = myObjectList.OrderBy(id => id.MyDate); 

再次謝謝大家幫我想出解決辦法,並顯示我是處理這個問題的更好方法。

謝謝!

回答

10

你只需要定義第二泛型類型,所以你可以在一個List<T>和一個獨立的比較(我稱之爲U)傳遞:

public static class ObjectExtension 
{ 
    public static List<T> Sort<T,U>(this List<T> o, Func<T, U> keySort, ESortDirection direction) where U : IComparable 
    { 
     if (direction == ESortDirection.asc) 
     { 
      o.Sort((a, b) => keySort(a).CompareTo(keySort(b))); 
     } 
     else 
     { 
      o.Sort((a, b) => keySort(b).CompareTo(keySort(a))); 
     } 
     return o; 
    } 
} 

話雖這麼說,我懷疑這是有用的。爲什麼不使用標準的LINQ OrderBy

排序依據略有不同,因爲這將在地方做整理,排序依據返回一個新的排序IEnumerable<T>,但堅持標準,通常更容易維護。

+0

感謝您的信息,這工作像一個魅力。我這樣做是因爲有不同的業務需求,需要基於查詢結果對不同列表進行排序。我不是每次都要重新查詢數據庫,而是要根據用戶請求的內容對業務進行排序。一些查詢是相當大的,我們的數據庫服務器的性能不是最好的(我無能爲力)。 – CodeLikeBeaker 2010-01-27 17:14:49

+0

@Jason Heine:嗯?如果你有一個'List '它在內存中,並且沒有任何數據庫接口。 – jason 2010-01-27 17:15:51

+0

@Jason,嗯,也許我錯過了一些東西。我明白你們在說什麼。看起來我正在做的是殺人。我將在OrderBy()上做更多的研究() – CodeLikeBeaker 2010-01-27 17:18:14

6

已有OrderBy擴展方法。

+0

正是。看看這裏http://stackoverflow.com/questions/2136145/how-to-sort-a-listt-by-double-value – 2010-01-27 17:32:17