[英]How to implement Strategy pattern using Generics in C#
我有一个弦
string partialCityName
和通用清单。
var city = List<City>
我想做两件事:
1.根据名称过滤列表,我这样做是这样的:
var availableCities = cityList.Where(f => f.CityName.StartsWith(partialCityName));
2.根据上面的变量“ 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));
}
}
首先,您可以这样声明接口:
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
阴影/遮罩了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));
}
您可以扩展一点以适应更复杂的过滤。 例如,如果您有国家/地区过滤器和城市过滤器,则城市过滤器也将具有国家/地区代码。
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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.