繁体   English   中英

如何在C#中使用泛型实现策略模式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM