2015-09-15 46 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