-4

これを行う簡単な方法があるかどうかを聞きたいだけです。

public void Model(string _model)
        { 
            var list =
                    from vehicle in vehiclesorted
                    where vehicle.Model == _model
                    orderby vehicle.Price
                    select vehicle;
            vehiclesorted = list.ToList();
        }

        public void Brand(string _brand)
        {
            var list =
                    from vehicle in vehiclesorted
                    where vehicle.Brand == _brand
                    orderby vehicle.Price
                    select vehicle;

            vehiclesorted = list.ToList();
        }

        public void Mph(int _mph)
        {
            var list =
                from vehicle in vehiclesorted
                where vehicle.Mph <= _mph
                orderby vehicle.Price
                select vehicle;

            vehiclesorted = list.ToList();
        }
4

2 に答える 2

5

これを、フィルタリングの述語を取るメソッドにリファクタリングできます。

private void CreateSortedList(Func<Vehicle, bool> predicate)
{
    vehiclesorted = vehiclesorted.Where(predicate).OrderBy(v => v.Price).ToList();
}

次に、呼び出しは次のようになります。

public void Mph(int _mph)
{
    CreateSortedList(v => v.Mph <= _mph);
}
public void Brand(string _brand)
{
    CreateSortedList(v => v.Brand == _brand);
}

そうは言っても、それぞれが単一のプライベート コレクションをフィルター処理する複数のパブリック メソッドを作成することは、特に後続の呼び出しが以前にフィルター処理された結果をフィルター処理するため、奇妙な設計の選択のように思えます。毎回元のリストをフィルタリングする必要があるでしょう。

通常、呼び出しごとに内部リストを変更するのではなく、フィルター処理された結果を返すことを検討することもお勧めします。これにより、よりクリーンな API が提供され、このクラスを使用する際の驚きが少なくなります。

于 2012-08-21T18:04:17.037 に答える
3

あなたのコードに見られる問題:

  • メソッドは 、 などを呼び出す必要がありFilterByModelますFilterByBrand
  • なぜvehiclesortedですかList?代わりに として保存し、値を読み取る必要がIEnumerable<Vehicle>ある場合にのみ に変換します。List
  • vehiclesortedはあまり良い名前ではありません - どうvehiclesSortedですか?
  • リストをフィルタリングするたびにリストを再ソートする必要はありません。
  • ラムダを使用したインライン LINQ 構文は、おそらくこちらの方がわかりやすいでしょう。

したがって、これらのメソッドをリファクタリングする方法は次のとおりです。

private IEnumerable<Vehicle> vehiclesSorted;

public void FilterByModel(string _model)
{ 
    vehiclesSorted = vehiclesSorted.Where(v => v.Model == _model);
}

public void FilterByBrand(string _brand)
{
    vehiclesSorted = vehiclesSorted.Where(v => v.Brand == _brand);
}

public void Mph(int _mph)
{
    vehiclesSorted = vehiclesSorted.Where(v => v.Mph <= _mph);
}

public List<Vehicle> Vehicles {
    get {
        return vehiclesSorted.ToList();
    }
}
于 2012-08-21T18:07:05.433 に答える