我有以下代碼:通用排序<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);
再次謝謝大家幫我想出解決辦法,並顯示我是處理這個問題的更好方法。
謝謝!
感謝您的信息,這工作像一個魅力。我這樣做是因爲有不同的業務需求,需要基於查詢結果對不同列表進行排序。我不是每次都要重新查詢數據庫,而是要根據用戶請求的內容對業務進行排序。一些查詢是相當大的,我們的數據庫服務器的性能不是最好的(我無能爲力)。 – CodeLikeBeaker 2010-01-27 17:14:49
@Jason Heine:嗯?如果你有一個'List'它在內存中,並且沒有任何數據庫接口。 –
jason
2010-01-27 17:15:51
@Jason,嗯,也許我錯過了一些東西。我明白你們在說什麼。看起來我正在做的是殺人。我將在OrderBy()上做更多的研究() – CodeLikeBeaker 2010-01-27 17:18:14