按字符串属性对列表进行排序,其中字符串是Nullable十进制

时间:2014-07-28 15:00:07

标签: c# linq list sorting

我有一个包含对象的列表。该对象具有名为AppointmentTime的字符串属性。这在我的视图中使用,可以说这可能更适合作为绑定上使用stringFormat的DateTime属性。

所以我的对象可能有一个看起来像这样的AppointmentTime:

Object1.AppointmentTime = "12.41"
Object2.AppointmentTime = "13.49"
Object3.AppointmentTime = ""
Object4.AppointmentTime = "9.43"

我现在想要通过此属性对此列表进行排序,列表底部的空字符串

到目前为止,我已经尝试过:

ListofObjects.OrderBy(x => Convert.ToDecimal(x.AppointmentTime);

但没有运气......任何想法?

编辑 - 我的解决方案

正如评论中有人非常友好地指出的那样。使用OrderBy会创建一个新列表,而不会对原始列表进行排序。愚蠢的微软,应该警告你,你没有设置新的列表等于任何东西。我的最终解决方案是:

diaryEntries = new ObservableCollection<DiaryEntryViewModel>(diaryEntries.OrderBy(x => x.AppointmentTime).OrderBy(x => string.IsNullOrEmpty(x.AppointmentTime)));

虽然我觉得长期解决方案是按照建议将此属性更改为DateTime

2 个答案:

答案 0 :(得分:3)

我会将AppointmentTime更改为DateTime,然后OrderBy将是小菜一碟:

ListofObjects = ListofObjects.OrderBy(x => x.AppointmentTime).ToList();

对于您引用的View,您可以稍后根据需要格式化DateTime的字符串表示形式。这样,您将获得订购数据的最简单方法,然后您将在视图中获得所需的格式。

答案 1 :(得分:1)

问题是将""传递给Convert.ToDecimal:您会触发异常。您可以通过添加显式检查来解决此问题,如下所示:

ListofObjects.OrderBy(x => string.IsNullOrEmpty(x.AppointmentTime) ? null : (decimal?)Convert.ToDecimal(x.AppointmentTime));

但是,最好的方法是使用内置类型来表示时间。例如,约会的a nullable TimeSpan? could be used to represent the time