从许多不同数据的列表中对字符串日期进行排序

问题描述 投票:0回答:3

我有一个来自数据库的列表,想要对该列表中的

DateofCreation
变量进行排序。它的数据类型是字符串。

我该怎么办?

我按照本网站此处

中的指示进行操作

并修改它以适合我的代码,错误是

Error    CS0834  A lambda expression with a statement body cannot be converted to an expression tree

var orderedList3 = collectionRecords.OrderByDescending(x =>
{
      DateTime dt;
      if (!DateTime.TryParse(x.DateOfCreation, out dt)) return DateTime.MaxValue;
      return dt;
});

collectionRecords
来自

public class CollectionRecords
{
    [Key]
    ...
    ...
    public string AuthorSource { get; set; }
    public string DateOfCreation { get; set; }
    public string VolumeIssueNo { get; set; }
    ...
}

示例输入:

  • 未注明日期
  • 1991 年 5 月 8 日
  • 2012 年 3 月
  • 各种日期
  • 2018 年 4 月 8 日

预期输出:

  • 2018 年 4 月 8 日
  • 2012 年 3 月
  • 1991 年 5 月 8 日
  • 各种日期
  • 未注明日期
c# list sorting date
3个回答
0
投票

您可以实现

IComparable
接口,并重写方法
CompareTo
,来决定默认的排序顺序。


0
投票

您可能应该听听其他人对数据库结构的评论,但是为了解决

expression tree
错误,您可以首先在数据库上执行以下语句:

var orderedList3 = collectionRecords.ToList().OrderByDescending(x =>
{
      DateTime dt;
      if (!DateTime.TryParse(x.DateOfCreation, out dt)) return DateTime.MaxValue;
      return dt;
});

展望未来根本不是一个好主意特别是如果你有更多数据。


0
投票

首先,您不应该使用字符串作为日期,这就是为什么您最终必须在订购之前先将它们转换为 DateTime 的原因。如果您需要存储日期,请将其存储为日期,而不是字符串。

预期值看起来是错误的。如果我通过 LinqPad 运行您的代码,我会得到正确的输出

Apr 8 2018 
march 2012 
1991 May 8 
various dates 
undated 

但这需要

DateTime.MinValue
而不是返回最大值。

我在 VS 中也得到相同的输出。

collectionRecords
的上下文是什么?可能是
IQueryable
?我认为如果您在订购之前尝试将其转换为数组或
IEnumerable
,它应该会像魅力一样工作。

已更新

如何将其存储在数据库中?作为字符串还是日期?创建到数据库的迁移并将其存储为日期,除非您特别要求将它们存储为字符串并存储“各种日期”或“未日期”等值,这有点错误,因为您打破了 DateTime 的概念。您不应在 DateTime 数据库字段中存储任何其他内容,也不应在 string/varchar 类型列中存储 DateTime 类型字段。数据库中最好有两个单独的列,例如:日期时间类型列,仅存储日期,并有一个布尔类型列,如“IsUdated”。

当然,如果您可以进行这些更改,这完全取决于您正在使用的软件,否则,您需要做您已经在做的事情,只需确保您用于表达的类型是正确的,而不是

IQueryable
,但一个列表或一个
IEnumerable

© www.soinside.com 2019 - 2024. All rights reserved.