【问题标题】:Using Lambda expressions to order a list by GMT date使用 Lambda 表达式按 GMT 日期排序列表
【发布时间】:2011-01-13 11:23:23
【问题描述】:

我有一个包含 GMT 格式日期的列表。

确保以下 Lambda 表达式在日期字段上排序为 GMT 的最优雅方法是什么?

ProductsList.OrderBy(Product => Product.Added).ToList(); 

【问题讨论】:

  • “GMT 格式”是什么意思?新增属性的类型是什么?
  • 格林威治标准时间。添加的是从 sql 数据库中检索的 DateTime 字段。顺便说一句,我知道这个问题是 Jon Skeet 的蜜罐!大声笑;->
  • GMT 有何相关性? Added 属性是否包含不同时区的日期?如果它们都在同一个时区,如果您只是按日期排序,或者如果您首先将所有日期转换为 GMT,则顺序不会改变。我想我在这里遗漏了一些东西......
  • 您好,Added 字段是源自数据库的 DateTime,并保存为 GMT,但我想确保稍后它不会被排序为字符串。但我想通过确保它在传递给列表时将其类型保持为日期时间将确保不会发生这种情况。
  • 如果您添加的日期时间是格林威治标准时间,那么您应该没有问题。如果您执行“Product.Added.ToString()”,它只会排序为字符串。

标签: c# datetime lambda gmt


【解决方案1】:

内置的 LINQ 运算符使用预期的排序操作(对于 LINQ-to-Objects,它使用 Comparer<T>.Default 执行此操作。您的 lambda 表达式是强类型的;编译器在幕后为您推断出一些泛型 - 实际上是:

var newList = Enumerable.OrderBy<Product,DateTime>(
         ProductsList, Product => Product.Added).ToList(); 

它已经知道它是DateTime,因此您唯一需要在这里做一些额外的事情就是您的日期包含一系列不同的时区。当然,一个时区你应该没问题,但你可以(如果你偏执的话)将所有转换为 UTC - 我不认为你需要这样做你的情况,但是:

var newList = ProductsList.OrderBy(
        Product => Product.Added.ToUniversalTime()).ToList();

请注意,这实际上创建了一个 second 列表(它不会改变原始列表的顺序);您可以使用 code from here 使用 lambda 进行就地排序:

ProductsList.Sort(Product => Product.Added);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多