我有一个包含对象的列表。该对象具有名为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
答案 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。