gpt4 book ai didi

c# - List 上的通用排序

转载 作者:太空狗 更新时间:2023-10-30 00:02:20 25 4
gpt4 key购买 nike

我有以下代码:

   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() 扩展方法通用,以便能够传入任何 List 对象进行排序?

因此,如果我创建了一个 OMySecondObject,我想使用相同的方法进行排序。

我尝试替换 List<OMyObject>List<T>List<object>但这不起作用。

有什么想法吗?

如果您需要进一步说明我正在尝试做的事情,请告诉我。

谢谢

更新:解决方案

好的,根据我的讨论和提供的答案(非常感谢所有回复的人),我想出了一个更简单的方法来做到这一点。

我有这个模拟数据库调用的方法:

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>。和一个单独的比较(我称之为 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

OrderBy 略有不同,因为这会进行就地排序,并且 OrderBy 返回一个新的排序 IEnumerable<T> ,但坚持标准通常更易于维护。

关于c# - List<T> 上的通用排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com