2015-09-15 17 views
3

如果重复,我很抱歉。请指出正确的问题。C#:自定义属性的排序列表

我有一个名为指明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 **

非常感谢您对阿列克谢,作者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 
        } 
      ); 
+0

它不完全相同的副本,OP的情况是不同的 –

+2

,需要一个'DateTime'类转换成'SqlDateTime',只公开了一个字符串' '?你真正的问题是这个团队。 – juharr

+0

你很明显看到了我相信的东西(http://stackoverflow.com/questions/3309188/how-to-sort-a-listt-by-a-property-in-the-object)因为它首先链接到您的帖子的标题搜索(https://www.bing.com/search?q=C%23+%3A+Sort+list+on+custom+property)。请说明为什么解决方案建议不起作用(包括自定义比较器),所以很明显这个帖子不重复。 –

回答

3

这可能是低效的,但你可以一个DateTime属性添加到您的MyEvent类转换StartDateDateTime和排序上:

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); 

或者,你可以使类不可变的和做转换实例化时:

var outputDate = myEvents.OrderByDescending(x=> 
          { 
          DateTime parsedDate; 
          return DateTime.TryParseExact(x.StartDate, "MM/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate) ? parsedDate : DateTime.MinValue; 
          }); 

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; } 
} 
+1

更好当创建一个MyEvent并且使MyEvent不可变时,它将设置MyStartDate属性。 – juharr

+0

非常感谢。我试过了,它工作。我试图以更好的方式做到这一点,以便不需要添加任何新的属性 – Ziggler

3

您可以使用LINQ OrderyBy()OrderByDescending方法根据您的需要这样写或适当的方式将创建一个自定义IComparer

public class StringDateComparer : IComparer<string> 
{ 

    public int Compare(string date1, string date2) 
    { 
     DateTime parsedDate1; 
     DateTime.TryParseExact(date1, "MM/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate1); 


     DateTime parsedDate2; 
     DateTime.TryParseExact(date2, "MM/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate2); 



     if (parsedDate1 < parsedDate2) 
      return -1; 
     if (parsedDate1 > parsedDate2) 
      return 1; 


     return 0; 
    } 
} 

现在叫OrderByDescending()超载这需要IComparer对象作为参数:

var outputDate = myEvents.OrderByDescending(x=>x.StartDate,new StringDateComparer()); 
+0

非常感谢。我没有尝试这个,但它帮助我了解如何在order linq语句中使用Comparer – Ziggler