This question already has answers here:
How to Sort a List<T> by a property in the object
(19个回答)
4年前关闭。
很抱歉,如果这是重复的。请指出正确的问题。
我有一个叫做MyDate的类,如下所示
我有一个叫做MyEvent的类,如下所示
我有喜欢的MyEvent的集合
现在,我需要按照StartDate的降序对myEvents进行排序。我的问题是我无法添加IComparable或更改MyDate,因为它是由其他团队编写的,我只是引用dll。我无法控制MyDate代码。有人可以帮我怎么做。我创建了一个新的比较器类,该类实现了IComparer,但无法理解如何使用它和对myEvents进行排序。
**更新1 **
非常感谢Alexei,Ehsan和Dave帮助我。我尝试了戴夫的答案,并且有效。我试图以更好的方式进行操作,因此无需添加任何新属性。我没有尝试使用Ehsan使用StringDateComparer的方式,但是它帮助我了解了如何在Order linq语句中使用Comparer。最后,正如阿列克谢所指出的那样
**更新2 **
有时我得到的是e2.StartDate.MMDDYYYYHHMMSS和/或e2.StartDate.MMDDYYYYHHMMSS的空字符串,因此我如下更改了代码
另外,您可以使类不可变并在实例化时进行转换:
(19个回答)
4年前关闭。
很抱歉,如果这是重复的。请指出正确的问题。
我有一个叫做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
}
);
最佳答案
这可能效率不高,但是您可以在DateTime
类中添加MyEvent
属性,将StartDate
转换为DateTime
并对其进行排序:
public class MyEvent
{
public int EventId{get;set;}
public MyDate StartDate{get;set;}
public DateTime MyStartDate { get { return DateTime.Parse(StartDate.MMDDYYYYHHMMSS); } }
}
var sorted = myEvents.OrderByDescending(e => e.MyStartDate);
另外,您可以使类不可变并在实例化时进行转换:
public class MyEvent
{
public MyEvent(int eventId, MyDate startDate)
{
EventId = eventId;
StartDate = startDate;
MyStartDate = DateTime.Parse(StartDate.MMDDYYYYHHMMSS);
}
public int EventId{get; private set;}
public MyDate StartDate{get; private set;}
public DateTime MyStartDate { get; private set; }
}
10-06 05:08