【问题标题】:how to sort a collection by datetime in c#如何在c#中按日期时间对集合进行排序
【发布时间】:2010-12-09 18:50:09
【问题描述】:

我有一个需要按日期时间排序的列表,MyStuff 类看起来像:

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

我需要能够按 Created (DateTime) 字段对集合列表进行排序。

【问题讨论】:

  • 为了正确格式化和高亮代码段,您需要在编辑器中高亮显示行并单击编辑器工具栏上的“代码”按钮(010 101),或按Ctrl-K on你的键盘

标签: c# sorting


【解决方案1】:

您似乎正在使用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();

【讨论】:

  • 我不会担心这里的“性能”。虽然指出不需要 LINQ/sort-by 的道具。
  • 这两种方法的主要区别在于List<T>.Sort 对现有列表进行排序,而OrderBy 返回一个新的IEnumerable<T> 并保留列表。如果您想保留原始列表,这要么是一个优势,要么如果您不这样做,则会影响性能。
  • @stevemegson:是的……我很想知道列表克隆和 List.Sort 与 OrderBy 相比如何。可能非常相似。
  • 如何使用您的排序建议进行 OrderByDescending?
  • @batmaci 要按降序排序,只需在比较中切换 x 和 y 的位置。 myList.Sort((x, y) => DateTime.Compare(y.Created, x.Created));
【解决方案2】:
var query = 
    from m in mystuffcollection
    orderby m.Created ascending
    select m;

【讨论】:

    【解决方案3】:

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

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

    现在使用 OrderBy 和 Sort 的主要区别在于性能和返回值。

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

    【讨论】:

      【解决方案4】:

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

       override
       protected IQueryable<T> FilterBy(IQueryable<T> 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<T> OrderBy(IQueryable<T> 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;
                       }
                      }
      

      【讨论】:

      • 如果你使用T而不是myStuff会更好,并给出一个调用示例。
      • 是的,我同意,这种方式比“myStuff”更通用。非常感谢!
      猜你喜欢
      • 2020-03-16
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      相关资源
      最近更新 更多