1

コレクションをフィルター処理しており、同じであるがフィールドが異なる 2 つのフィルターを実行しています。ここでコードの重複を減らす方法が必要ですか? チェックは、日付が入力されているかどうか、およびユーザーが入力した締切日より前であるかどうかです。

    public override IList<Company> Search()
    {
        var list = CacheObjects.Subcontractors;

        this.ApplicationFormReturnedCheck(ref list);

        this.ApplicationFormSentCheck(ref list);
    }

    private void ApplicationFormReturnedCheck(ref IList<Subcontractor> list)
    {
        if (this.ApplicationFormNotReturnedFlag == true && this.ApplicationFormReturned != null)
        {
            list =
                list.Where(x => x.ApplicationFormReturned == null || x.ApplicationFormReturned < this.ApplicationFormReturned).ToList();
        }
        else if (this.ApplicationFormNotReturnedFlag == true)
        {
            list = list.Where(x => x.ApplicationFormReturned == null).ToList();
        }
        else if (this.ApplicationFormReturned != null)
        {
            list = list.Where(x => x.ApplicationFormReturned < this.ApplicationFormReturned).ToList();
        }
    }

    private void ApplicationFormSentCheck(ref IList<Subcontractor> list)
    {
        if (this.ApplicationFormNotSentFlag == true && this.ApplicationFormSent != null)
        {
            list =
                list.Where(x => x.ApplicationFormSent == null || x.ApplicationFormSent < this.ApplicationFormSent).ToList();
        }
        else if (this.ApplicationFormNotSentFlag == true)
        {
            list = list.Where(x => x.ApplicationFormSent == null).ToList();
        }
        else if (this.ApplicationFormSent != null)
        {
            list = list.Where(x => x.ApplicationFormSent < this.ApplicationFormSent).ToList();
        }
    }
4

2 に答える 2

0

Func(T, TResult)を使用して、一般的な述語メソッドをカプセル化できます。あなたの場合、フィルターでインスタンスメンバーを使用しているため、コンストラクターで Func を初期化する必要があります。元:

private readonly Func<Subcontractor, bool> _pred;

public Subcontractor()
{
    _pred = x => x.ApplicationFormReturned == null || x.ApplicationFormReturned < this.ApplicationFormReturned;
}

private void ApplicationFormReturnedCheck( ref IList<Subcontractor> list )
{
    if( this.ApplicationFormNotReturnedFlag == true && this.ApplicationFormReturned != null )
    {
        list = list.Where( _pred ).ToList();
    }
    else if( this.ApplicationFormNotReturnedFlag == true )
    {
        list = list.Where( x => x.ApplicationFormReturned == null ).ToList();
    }
    else if( this.ApplicationFormReturned != null )
    {
        list = list.Where( x => x.ApplicationFormReturned < this.ApplicationFormReturned ).ToList();
    }
}
于 2013-05-29T15:44:49.870 に答える