如何在c#中按日期时间对集合进行排序

时间:2009-10-24 19:40:00

标签: c# sorting

我有一个List,我需要按DateTime排序,类MyStuff看起来像:

public class MyStuff
{
   public int Type {get;set;}
   public int Key {get;set;}
   public DateTime Created {get;set;}
}

我需要能够通过Created(DateTime)字段对集合List进行排序。

4 个答案:

答案 0 :(得分:80)

您似乎正在使用List<T>对象,在这种情况下,最有效(和简单)的方法如下:

myList.Sort((x, y) => DateTime.Compare(x.Created, y.Created));

这使用List.Sort方法的重载而不是Comparison<T>委托(因而是lambda表达式)。

您当然可以使用LINQ OrderBy扩展方法,但我不认为这会带来任何好处,并且可能会明显变慢,具体取决于您的情况。

myList = myList.OrderBy(x => x.Created).ToList();

答案 1 :(得分:7)

var query = 
    from m in mystuffcollection
    orderby m.Created ascending
    select m;

答案 2 :(得分:0)

考虑到您在应用程序中使用的是.net core,可以从实体框架使用using System.Linq;。 Linq为您提供FilterBy和OrderBy方法,对于自定义FilterBy和OrderBy,您需要覆盖类或存储库中的方法。

 override
 protected IQueryable<myStuff> FilterBy(IQueryable<MyStuff> myProcess, string filterBy, string filterValue)
                {
                    var listFilter = filterBy.Split(',');
                    var listValues = filterValue.Split(',');

                    for (int index = 0; index < listFilter.Length; index++)
                    {
                        var filter = listFilter[index];
                        var value = listValues[index];

                        switch (filter)
                        {
                            case "type":
                                myProcess = myProcess.Where(c => c.Status.Nome.Contains(value));
                                break;
                            case "created":
                                  myProcess = myProcess.Where(c => c.Created - DateTime.Parse(value) >= new TimeSpan(0, 0, 0));
                            default:
                               break;
                  }
                }
              }

    override
    protected IQueryable<myStuff> OrderBy(IQueryable<MyStuff> myProcess, string attribute, string direction)
                {
                    switch (attribute)
                    {
                        case "type":
                            myProcess = (direction == "asc")
                                ? myProcess.OrderBy(c => c.Type)
                                : myProcess.OrderByDescending(c => c.Type);
                            return myProcess;
                        case "created":
                            myProcess = (direction == "asc")
                                ? myProcess.OrderBy(c => c.Created)
                                : myProcess.OrderByDescending(c => c.Created);
                    return myProcess;
                 }
                }

答案 3 :(得分:0)

对于那些正在寻找一种基于嵌套属性对数据进行排序的方法的人,可以使用如下所示的sort函数:

MyList.Sort((x, y) => x.Datetime.CompareTo(y.Datetime));

现在,使用OrderBy和Sort之间的主要区别是性能和返回值。

排序基本上对现有的List<T>进行排序,而OrderBy返回一个新的IEnumerable<T>