标签:
背景
过滤指的是从原始数据集合中筛选出符合需求的数据子集的一个过程。
实际生产中的过滤需求总结下来一般有以下几个方面:
本文的目的在于构建一个通用的过滤框架,这个框架:
过程
接下来,我们设计一个实例,来让大家了解一下如何使用,并起一个抛砖引玉的作用
假设有一列字符串:"123","246","b","15","16","a32",我们需要在这组字符串中拿出一组子串,这个子串需要满足:
那么按照上面的需求,我们的框架的运行结果应为:"123","15"
分析上面的需求,我们需要通过以下几个步骤来构建一个自定义过滤器:
[Flags] public enum DemoStringEnumType { /// <summary> /// 长度大于3 /// </summary> LongLen = 1, /// <summary> /// 包含1 /// </summary> HasOne = 2, /// <summary> /// 无效值 /// </summary> NN = 1024 }
public class StringFilterCore : ComplexFilterCore<string, StringEnumType> { }
/// <summary> /// 是否是整数过滤器 /// 继承IFilter /// </summary> public class IsNumberFilter : IFilter<string> { /// <summary> /// 判断字符串是否为政策 /// </summary> /// <param name="item">待检验字符串</param> /// <returns>bool</returns> public bool DoFilter(string item) { int tem; return int.TryParse(item, out tem); } }
/// <summary> /// 识别器 /// 继承IEnumTypeIdentifier接口 /// </summary> public class IdentifyDemoString : IEnumTypeIdentifier<string, DemoStringEnumType> { /// <summary> /// 识别对象特性 /// </summary> /// <param name="item">待识别字符串</param> /// <returns>DemoStringEnumType</returns> public DemoStringEnumType IdentifyItemTypeAsEnumType(string item) { //初始化结果 DemoStringEnumType result = DemoStringEnumType.NN; //识别长度是否大于3 if (item.Length > 3) { result |= DemoStringEnumType.LongLen; } //识别是否包含1 if (item.Contains("1")) { result |= DemoStringEnumType.HasOne; } return result; } }
static void Main(string[] args) { //初始化过滤器 ComplexFilterCore<string, DemoStringEnumType> demoStrFilterCore = new ComplexFilterCore<string, DemoStringEnumType>(); //初始化 HasOne 2 LongLen 1 demoStrFilterCore.SetMinGetCount(DemoStringEnumType.LongLen, 1); demoStrFilterCore.SetMinGetCount(DemoStringEnumType.HasOne, 2); //注册类型识别器 识别特性 DemoStringEnumType demoStrFilterCore.RegistEnumTypeIdentifier(new IdentifyDemoString()); //添加过滤器 过滤掉不是整数的字符串 demoStrFilterCore.AddFilter(new DemoStringContentFilter()); //初始化数据源 var ls = new List<string> { "123", "246", "b", "15", "16", "a32" }; //执行过滤 var result = demoStrFilterCore.GetFilteredResult(ls); //打印结果 Console.WriteLine(string.Join(",", result.Keys)); Console.ReadKey(); }
收获
抽象出通用的部分,让开发人员只关注于业务是框架存在的一大必要因素。本文提出的过滤方案具有很高的扩展性,有兴趣的同学可以下载demo研究下。
标签:
原文地址:http://www.cnblogs.com/SmallZL/p/4262948.html