2016-12-16 5 views
1

質問を並べ替える必要があります。C#IComparerクラスにリポジトリを挿入するには?

一つのテーブルの名前質問QuestionIdSORTORDERでのソート順情報。

他のテーブルApplicantQuestionsQuestionIdすることにより、第1のテーブルを参照し、すべての質問と回答が含まれています。

したがって、基本的に別のリストに基づいてリストを並べ替える必要があります。

public class QuestionOrderComparer : IComparer<int> 
{ 
    private readonly IRepository<Question> _Questions; 

    public QuestionOrderComparer(IRepository<Question> Questions) 
    { 
     _Questions = Questions; 
    } 

    public int Compare(int x, int y) 
    { 
     var questionsInOrder = _Questions.All 
      .Select(q => new QuestionOrderModel(q.QuestionId, q.SortOrder)) 
      .ToList(); 

     var xValue = questionsInOrder.FirstOrDefault(q => q.Id == x)?.SortOrder ?? 0; 
     var yValue = questionsInOrder.FirstOrDefault(q => q.Id == y)?.SortOrder ?? 0; 
     return xValue - yValue; 
    } 
} 

罰金に見えますが、私はインテリセンスがIRepository<Question>ためのいくつかのパラメータを追加するために私を必要とし、それを

thisSetOfApplicantQuestions 
    .OrderBy(x => x.QuestionId, new QuestionOrderComparer()); 

を使用しようとします。

これに対処するにはどうすればよいですか? IComparerクラス内に注射が可能ですか?

+1

あなたのコンストラクタは 'IRepository 'パラメータを必要とします。 1つをコンストラクタに渡す必要があります。 –

+0

私のStructureMapによって自動的に解決されるはずですか? – Blaise

+0

'OrderBy'を呼び出すクラスに既に' IRepository'インスタンスが挿入されていませんか?純粋なDIを使用している場合(つまり、すべてが注入されている構成ルートがある場合)、すべての依存関係はコンストラクタを介して注入され、より深い内部クラスに渡されます。それ以外の場合は、サービスロケータを使用して比較元(純粋なDIではありません)を解決できます。 – Groo

答えて

1

工場の裏に隠れているのはどうですか?構造マップはあなたのためにすべてを解決します。

Btwこのロジックを多くの場所で再利用しない限り、このロジックをコンペアラに入れません。私はいつも外部の依存関係のない非常に単純なケースでは、comparerを使うことを考えました。

1

比較者をダンプし、そのコードを質問コレクションオブジェクトのSortメソッドに入れます。

このコードは、比較と並べ替えが競合しています。従来、クラスはCompareToをオーバーライドしていましたが、顧客比較ツールがあります。 .netフレームワークは、一連の質問に対してsortを呼び出すときにこれを使用することを知っています。 "比較"メソッドは、比較する必要があります - 実際のソートを行わない-1,0,1(それぞれより小さい、等しい、より大きい)を返します。私はLINQがそのパラダイムを変えるのを見ることができますが、依然としてCompareの並べ替えを行うことはフレームワークに対して働いているようです。次に、Questionsコレクションには比較者が必要です。その逆もありません。

関連する問題