我想订购我的“SortObject”类的列表。此类旨在通过保存在字典(名为“单元格”)中组织的任意数据来模仿DataGrid Row,其中键类似于 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
当我尝试使用 DateTime 类型的 OrderBy 对象时会出现问题,其中一些对象未设置并且默认为“System.DBNull”。在这种情况下,调用 'sortedList.First()' 或以后对 'sortedList' 的任何引用都会引发异常。例外很简单:“对象必须是 DateTime 类型”,这似乎是 OrderBy 尝试将 DateTime 类型与 DBNull 类型进行比较的结果。
我尝试了两种到目前为止还没有奏效的解决方案:
尝试一:将 DBNull 设置为新的 DateTime。理论上这应该可行,但我不仅需要创建 DateTime 类型的对象,还需要动态创建任意类型的对象。(我还需要注意这些 SortObjects 并将它们的数据设置回 DBNull 一旦我的顺序正确;我实际上不能真正更改数据)。
尝试二:只组织 DBNull,然后只组织 DateTime,然后将它们打在一起。同样,这在理论上可能有效,但代码片段中提到的“其他工作”是广泛的,包括使用 ThenBy() 对任何键进行任意次数的重新排序。将其复杂性加倍并不是一个优雅的解决方案,我认为它是一种备份。
解决此问题的最佳方法是什么?