【发布时间】:2020-05-29 14:10:30
【问题描述】:
我想订购我的“SortObject”类的列表。此类旨在通过保存组织在字典(名为“单元格”)中的任意数据来模仿DataGrid 行,其中键类似于 DataGrid 列。强制任何给定键仅与一种数据类型相关联,例如键“名称”将仅具有字符串类型的值。
我的代码(如下)实际上适用于我使用过的大多数情况:
// public Dictionary<string, object> Cells { get; set; } <-- relevant field from 'SortObject'
List<SortObject> sortObjects = GetSortObjects(); // This is simplified, the data has a few different sources
IOrderedEnumerable<SortObject> orderedList = sortObjects.OrderBy(p => p.Cells["ArbitraryKey"]);
SortObject firstObject = sortedList.First();
// other work with 'orderedList' follows
问题发生在我尝试 OrderBy DateTime 类型的对象时,并且其中一些对象未设置且默认为“System.DBNull”。在这种情况下,调用 'sortedList.First()' 或以后对 'sortedList' 的任何引用都会引发异常。例外很简单:“对象必须是 DateTime 类型”,这似乎是 OrderBy 尝试将 DateTime 类型与 DBNull 类型进行比较的结果。
我已经尝试了两种目前还没有奏效的解决方案:
尝试一:将 DBNull 设置为新的 DateTime。理论上这应该可行,但我不仅需要创建 DateTime 类型的对象,还需要动态创建任意类型的对象。 (我还需要记下这些 SortObjects 并将它们的数据设置回 DBNull 一旦我有正确的顺序;毕竟我实际上不能更改数据)。
尝试二:只组织 DBNull,然后只组织 DateTime,然后将它们组合在一起。同样,这在理论上可能有效,但代码 sn-p 中提到的“其他工作”是广泛的,包括使用 ThenBy() 对任何键进行任意次数的重新排序。将其复杂性加倍并不是一个优雅的解决方案,我认为它是一种备份。
解决这个问题的最佳方法是什么?
PS:对于 OrderBy 和 DateTime,我使用的是 Microsoft .NET Framework v4.6.2
【问题讨论】:
-
你可以试试
p => p.Cells["ArbitraryKey"] ?? new DateTime() -
@Grax32 它需要类似于
p => p.Cells["ArbitraryKey"] is DBNull ? new DateTime() : p.Cells["ArbitraryKey"],因为DBNull与null不同 -
好消息@juharr。任务是确保 orderBy 仅获取有效的 DateTime 值以进行排序。
-
OrderBy(v => v is DBNull ? null : v)OrderBy 可以处理空值,但不能处理 dbNulls。该代码应该适用于所有数据类型(我认为) -
YW。我发布了与下面的答案相同的信息。我喜欢干净简单的解决方案。
标签: c# datetime iorderedenumerable