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

ダミーのテンプレート値と型推論を介して行うことができます。ただし、ジェネリック メソッドを持つ非ジェネリック クラスが必要です。

ProjectionComparerこれらすべてを実装する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);

(false/true の順序を覚えていないことに注意してください。 の比較を逆にする必要がある場合がありますEndDate。)

于 2012-07-26T12:26:44.493 に答える
2

EndDate < 今日のすべてのアイテムを一番下に配置するには、使用できる 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

IComparable<T>クラス内にインターフェイスを実装するBankAccountViewModelと、クラスのすべてのプロパティを使用できます。Or は、インターフェイス のベース BankAccountViewModel クラスの継承制約を示しますIComparer<T>

于 2012-07-26T12:31:40.017 に答える
0

両方のビュー モデルに、比較するプロパティを定義するインターフェイスを実装させてから、比較子をそのインターフェイスで動作させます。

于 2012-07-26T12:26:10.390 に答える