1

我有一个字符串

string partialCityName

和一个通用列表。

var city = List<City>

我想做两件事:

1. 根据名称过滤列表,我这样做是这样的:

var availableCities = cityList.Where(f => f.CityName.StartsWith(partialCityName));

2.根据上面的var“availableCities”获取一个字符列表,我就是这样做的。

var nextAvailableCharacters = avalibleCities .
          Where(s => s.CityName.Length > partialCityName.Length).
          Select(s => s.CityName.Substring(partialCityName.Length)[0]).ToList();

目前,这是以一种方法发生的,并且正在发挥作用。但是我试图理解设计模式,并试图实现策略模式。

所以第一个问题是,这是使用正确的模式吗?如果有怎么办?

这就是我到目前为止所得到的。

public interface IFilterStrategy
{
   List<T> Filter<T>(List<T> filterThisData, string filter);
}

然后:

    public class FilterCityStrategy : IFilterStrategy
    {

        public List<City> Filter<City>(List<City> filterThisData, string partialCityName)
        {
            //Fails to compile cityName not member of f 
            return filterThisData.Where(f => f.CityName.StartsWith(partialCityName));
        }
    }
4

2 回答 2

3

首先,你声明你的接口是这样的:

public interface IFilterStrategy<T>
{
    List<T> Filter(List<T> filterThisData, string filter);
}

然后您需要继承此接口的特定类型实例化:

public class FilterCityStrategy : IFilterStrategy<City>
{
    public List<City> Filter(List<City> filterThisData, string partialCityName)
    {
      return filterThisData.Where(f => f.CityName.StartsWith(partialCityName)).ToList<City>();
    }
}

https://repl.it/repls/UnluckyEqualRaptors

您得到的错误是因为该Filter方法被声明为带有模板参数的模板方法City。这意味着它City在此函数定义中充当任意类型,因此City在代码中的其他位置隐藏/屏蔽类的声明:

    public List<City> Filter***<City>***(List<City> filterThisData, string partialCityName)
    {
        //Fails to compile cityName not member of f 
        return filterThisData.Where(f => f.CityName.StartsWith(partialCityName));
    } 
于 2018-01-22T22:36:58.273 回答
0

您可以稍微扩展它以适应更复杂的过滤。例如,如果您有一个国家过滤器和一个城市过滤器,那么城市过滤器也可能有一个国家代码。

interface IFilter
{
}

class CountryFilter 
{
    string PartialCountryName { get; set;}
}

class CityFilter 
{
    string CountryCode { get; set;}
    string PartialCityName { get; set;}
}



interface IFilterStrategy<T,U> where U:IFilter
{
    List<T> Filter(List<T> source,U filter);
}

class CountryFilterStategy : IFilterStrategy<Country,CountryFilter>
{
    List<Country> Filter(List<Country> source,CountryFilter filter)
    {
        //logic
    }
}


class CityFilterStategy : IFilterStrategy<City,CityFilter>
{
    List<City> Filter(List<City> source,CityFilter filter)
    {
        //logic
    }
}
于 2018-01-22T23:24:33.493 回答