-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?将其存储为 a IEnumerable<Vehicle>,并且仅List在需要读取其值时将其转换为 a 。
  • vehiclesorted不是一个很好的名字-怎么样vehiclesSorted
  • 您不需要在每次过滤列表时重新排序。
  • 使用 lambda 的内联 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 回答