【发布时间】:2015-09-15 18:05:53
【问题描述】:
如果这是重复的,我很抱歉。请指出正确的问题。
我有一个名为 MyDate 的类,如下所示
public class MyDate
{
private SqlDateTime m_dateTime;
public MyDate(DateTime dateTime)
{
if (DateTime.Compare(dateTime, (DateTime)SqlDateTime.MinValue) <= 0)
m_dateTime = SqlDateTime.MinValue;
else
m_dateTime = dateTime;
}
public string MMDDYYYYHHMMSS
{
get
{
if(m_dateTime > SqlDateTime.MinValue)
return m_dateTime.Value.ToString("MM/dd/yyyy hh:mm:ss tt");
else
return String.Empty;
}
}
}
我有一个名为 MyEvent 的类,如下所示
public class MyEvent
{
public int EventId{get;set;}
public MyDate StartDate{get;set;}
}
我收集了类似的 MyEvent
List<MyEvent> myEvents.
现在我需要按 StartDate 的降序对 myEvents 进行排序。我遇到的问题是我无法添加 IComparable 或更改 MyDate,因为它是由其他团队编写的,我只是引用 dll。我无法控制 MyDate 代码。任何人都可以帮助我怎么做。我创建了一个新的比较器类,它实现了 IComparer,但无法理解如何使用它并对 myEvents 进行排序。
**更新 1 **
非常感谢 Alexei、Ehsan 和 Dave 帮助我。我试过戴夫的回答,它奏效了。我试图以更好的方式做到这一点,这样就不需要添加任何新属性。我没有尝试 Ehsan 使用 StringDateComparer 的方式,但它帮助我了解了如何在 Order linq 语句中使用 Comparer。最后正如阿列克谢所指出的那样,我确实喜欢下面
**更新 2 **
有时我得到 e2.StartDate.MMDDYYYYHHMMSS 和/或 e2.StartDate.MMDDYYYYHHMMSS 的空字符串,所以我更改了如下代码
myEvents.Sort(
delegate(MyEvent e1, MyEvent e2)
{
DateTime dt1;
DateTime dt2;
DateTime.TryParse(e1.StartDateTime.MMDDYYYYHHMMSS, out dt1);
DateTime.TryParse(e2.StartDateTime.MMDDYYYYHHMMSS, out dt2);
return dt2.CompareTo(dt1); // descending
//return dt1.CompareTo(dt2); // ascending
}
);
【问题讨论】:
-
不完全重复,OP场景不同
-
接受
DateTime的类转换为SqlDateTime并且只公开string?你真正的问题是另一个团队。 -
您显然已经看到了我认为是 duplicate 的问题,因为它首先链接到搜索您的帖子标题 (bing.com/search?q=C%23+%3A+Sort+list+on+custom+property)。请澄清为什么建议的解决方案不起作用(包括自定义比较器),因此很明显这篇文章不是重复的。
-
我的情况不同。在 MyDate 我没有任何 DateTime 属性。所以我不能按方法使用任何排序或顺序。我试图避免在 MyEvent 类中添加额外的属性。我试过 IComparer。我看到的所有示例都只是直接使用 OrderBy linq 语句跳转,而没有显示 IComparer 实现是如何形成的......
-
@Ziggler stackoverflow.com/a/3309397/477420 展示了自定义比较器的完美示例...