1

我想根据位于视图模型中的 2 个属性来比较我的视图模型集合。我需要的是根据开始日期对我的视图模型进行排序,但如果结束日期比今天低,它应该放在集合的底部,关于在订​​单完成后它应该如何的示例:

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 个属性对集合进行排序?

4

4 回答 4

3

您可以通过虚拟模板值和类型推断来做到这一点。不过,您将需要一个具有泛型方法的非泛型类。

您可能想查看实现所有这些的ProjectionComparerMiscUtil 例如:

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

(请注意,我不记得 false/true 的顺序 - 您可能需要反转比较EndDate。)

于 2012-07-26T12:26:44.493 回答
2

要将 EndDate < today 的所有项目放在底部,然后按 StartDate 对所有内容进行排序,您可以使用:

var today = DateTime.Today;
bankPolicyViewModels
    .OrderBy(vm => vm.BankAccountViewModel.EndDateIRA < today ? 1 : 0);
    .ThenBy(vm => vm.BankAccountViewModel.StartDateIRA);
于 2012-07-26T12:28:18.293 回答
0

让两个视图模型实现一个定义被比较属性的接口,然后让比较器在该接口上运行。

于 2012-07-26T12:26:10.390 回答
0

IComparable<T>您可以在类内部实现接口BankAccountViewModel,这样您就可以使用该类的所有属性。或者表示接口的基础 BankAccountViewModel 类继承约束IComparer<T>

于 2012-07-26T12:31:40.017 回答