我有以下代码:
我也有这段代码:
所以你可以看到我正在传递一个属性来排序。
问题是:
如何使我的Sort()扩展方法通用,以便能够传递任何列表对象进行排序?
因此,如果我创建了OMySecondObject,则希望使用相同的方法进行排序。
我尝试用List<T>或List<object>替换List<OMyObject>,但那样不起作用。
有什么想法吗?
如果您需要进一步澄清我正在尝试做什么,请告诉我。
谢谢
更新:解决方案
好的,基于我的讨论和提供的答案(非常感谢回答的每个人),我已经找到了更简单的方法来做到这一点。
我有这个模拟数据库调用的方法:
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();
所以你可以看到我正在传递一个属性来排序。
问题是:
如何使我的Sort()扩展方法通用,以便能够传递任何列表对象进行排序?
因此,如果我创建了OMySecondObject,则希望使用相同的方法进行排序。
我尝试用List<T>或List<object>替换List<OMyObject>,但那样不起作用。
有什么想法吗?
如果您需要进一步澄清我正在尝试做什么,请告诉我。
谢谢
更新:解决方案
好的,基于我的讨论和提供的答案(非常感谢回答的每个人),我已经找到了更简单的方法来做到这一点。
我有这个模拟数据库调用的方法:
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);
再次感谢大家帮助我解决问题并展示更好的处理方式。
谢谢!
List<T>
,它是在内存中的,不需要与数据库进行任何交互。 - jason