2012-07-26 74 views
0

我想比較我的viewmodel的集合,它基於viewmodel中的兩個屬性。 我需要的是根據startdate對我的視圖模型進行排序,但是如果結尾日期與今天一樣低,它應該放置在集合的底部 在完成排序之後它應該如何應用的示例:傳遞一個匿名類型到IComparer <T>

Stardate Enddate  
25/06/2012 25/06/2022  
21/06/2012 21/04/2018  
31/06/2012 02/07/2012  
28/06/2012 01/07/2012 

我想,這應該叫,像這樣:

bankPolicyViewModels.OrderBy(vm => new {StartDate = vm.BankAccountViewModel.StartDateIRA, 
             EndDate = vm.BankAccountViewModel.EndDateIRA}, 
             new ComparerForAnonymousType); 

但我無法弄清楚如何定義比較器。 目前,我只帶了這一點:

public class ComparerForAnonymousType<T> : IComparer<T> 
     where T : class 
{ 
    public int Compare(T x, T y) 
    { 
     throw new NotImplementedException(); 
    } 
} 

我可以嘗試通過反射來解決已定義的屬性,但是這將是很容易的出路(也表現重型我猜)。

是否有某種方法可以將匿名類型定義爲T,或者是否有其他方法可以根據2個屬性對集合進行排序?

回答

3

您可以通過虛擬模板值和類型推斷來實現。儘管如此,你仍然需要一個非泛型的類。

你可能想看看在MiscUtil它實現所有這一切。因此,例如:

var dummy = new { StartDate = default(DateTime), 
        EndDate = default(DateTime) }; 
var now = DateTime.Now; 
var comparer = ProjectionComparer.Create(dummy, x => x.EndDate >= now) 
           .ThenBy(x => x.StartDate); 

在另一方面,你已經在使用LINQ,它可能更有意義使用OrderBy(x => x.StartDate).ThenBy(x => x.EndDate)下手......

var now = DateTime.Now; 
var ordered = bankPolicyViewModels.OrderBy(vm => vm.EndDate >= now) 
            .ThenBy(vm => vm.StartDate); 

(請注意,我可以「記得了假/真副手的順序 - 你可能需要扭轉對EndDate比較)

+0

哇,我現在覺得很愚蠢,不知道'.ThenBy()',在銥星的答案中也提到過。 'ProjectionComparer'看起來也很有趣,它會很快檢查出來,但與其他解決方案相比,它增加了太多的複雜性。 – 2012-07-26 13:22:42

0

使兩個視圖模型都實現一個接口,該接口定義要比較的屬性,然後使比較器在該接口上運行。

2

把所有的物品與結束日期今天<在底部,然後排序開始日期都可以使用:

var today = DateTime.Today; 
bankPolicyViewModels 
    .OrderBy(vm => vm.BankAccountViewModel.EndDateIRA < today ? 1 : 0); 
    .ThenBy(vm => vm.BankAccountViewModel.StartDateIRA); 
0

您可以在BankAccountViewModel類中實現接口IComparable<T>,這樣您就可以使用該類的所有屬性。或者表示接口IComparer<T>的基本BankAccountViewModel類繼承約束。