“Array”先生的新伙伴:“谓词”

简介: 在讲“Array”先生和他的新伙伴“谓词”之前,让我们先回顾一下常写的一些程序片断。 假定我们有了一个存储股票代码的数组         //声明并构造一个股票代码的组合        string[] StockIDAry = {                               ...

在讲“Array”先生和他的新伙伴“谓词”之前,让我们先回顾一下常写的一些程序片断。

假定我们有了一个存储股票代码的数组

img_a6339ee3e57d1d52bc7d02b338e15a60.gif          // 声明并构造一个股票代码的组合
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
         string [] StockIDAry  =   img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif                               
"600616"
img_33d02437d135341f0800e3d415312ae8.gif                               
"600123",   
img_33d02437d135341f0800e3d415312ae8.gif                               
"000002",
img_33d02437d135341f0800e3d415312ae8.gif                               
"610003"
img_33d02437d135341f0800e3d415312ae8.gif                               
"600001"
img_05dd8d549cff04457a6366b0a7c9352a.gif                              }
;

如果要判断数组中是否有满足某个条件的值,那么我们常规的写法是这样的:

img_a6339ee3e57d1d52bc7d02b338e15a60.gif          // 判断存在性
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
         foreach  ( string  StockID  in  StockIDAry)
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif            
if (s.StartsWith("600"))
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif                
return true;
img_105a1e124122b2abcee4ea8e9f5108f3.gif            }

img_05dd8d549cff04457a6366b0a7c9352a.gif        }

如果要找出数组中满足某个条件的元素,再组合成新的数组,你可能会这样写:

img_a6339ee3e57d1d52bc7d02b338e15a60.gif         ArrayList aryLst  =   new  ArrayList();
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        
// 找到满足条件的值
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
         foreach  ( string  StockID  in  StockIDAry)
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif            
if (s.StartsWith("600"))
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif                aryLst.Add(s);
img_105a1e124122b2abcee4ea8e9f5108f3.gif            }

img_05dd8d549cff04457a6366b0a7c9352a.gif        }

诸如此类,根据一个条件来进行数组循环,获取一个判断,或者一个结果元素,或者结果数组。写法也大同小异的差不多。
善良的微软总是为我们程序员着想的,为了减少这种重复的手工劳动,在.net framework 2.0里,推出了 谓词 这个概念。
“谓词”从语文上讲就是:作一个动作的词语
那么,谓词这玩意拿来做什么呢?存在必有理。我们先看上面两段程序用了谓词之后的代码段:

img_a6339ee3e57d1d52bc7d02b338e15a60.gif bool  isExist  =  Array.Exists(StockIDAry, SearchRule);

 

img_a6339ee3e57d1d52bc7d02b338e15a60.gif string [] subArray  =  Array.FindAll(StockIDAry, SearchRule);

不好意思还没完,我们的主角“谓词”先生还没登场,且看

img_a6339ee3e57d1d52bc7d02b338e15a60.gif      // 从股票代码的组合中抽取代码的 搜索谓词
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
     private   static   bool  SearchRule(String s)
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif    
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif        
if ( s.StartsWith("600") )
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif            
return true;
img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

img_33d02437d135341f0800e3d415312ae8.gif        
else
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif            
return false;
img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

img_05dd8d549cff04457a6366b0a7c9352a.gif    }

在这个示例里,“谓词”先生的名字叫着 SearchRule 。

怎么样?看到“谓词”先生的神通广大了吧?其实我们还忽视了真正的主角“Array”。正是这默默无闻的“Array”充当了幕后的主角,在.net Framework 2.0的舞台上,他拥有了几项新的超能力,正是这些超能力又让我们可怜的程序员,编码工,减少了一点机械的工作。“Array”真是个好yin!

img_a6339ee3e57d1d52bc7d02b338e15a60.gif          // 显示 搜索谓词 的存在性
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
        Array.Exists([搜索的数组],[谓词])
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        
// 显示 搜索谓词 是否对数组中所有元素都有效
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
        Array.TrueForAll([搜索的数组],[谓词])
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        
// 显示 搜索谓词 找到的数组中的第一个匹配项
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
        Array.Find([搜索的数组],[谓词])
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        
// 显示  搜索谓词 找到的数组中的最后一个匹配项
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
        Array.FindLast([搜索的数组],[谓词])
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        
// 获取 搜索谓词 找到的数组中的所有匹配项
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
        Array.FindAll([搜索的数组],[谓词])

完整的大戏剧本在这里。戏怎么演,你们自己选择:

img_a6339ee3e57d1d52bc7d02b338e15a60.gif using  System;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
public   class  Example
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif    
public static void Main()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif        SearchInStockIDAry();
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }

img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif    
private static void SearchInStockIDAry()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif        
//声明并构造一个股票代码的组合
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
        string[] StockIDAry = img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif                               
"600616"
img_33d02437d135341f0800e3d415312ae8.gif                               
"600123",   
img_33d02437d135341f0800e3d415312ae8.gif                               
"000002",
img_33d02437d135341f0800e3d415312ae8.gif                               
"610003"
img_33d02437d135341f0800e3d415312ae8.gif                               
"600001"
img_105a1e124122b2abcee4ea8e9f5108f3.gif                              }
;
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif        Console.WriteLine();
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif        
//显示组合中每个值
img_33d02437d135341f0800e3d415312ae8.gif
        foreach (string StockID in StockIDAry)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif            Console.WriteLine(StockID);
img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif        
//显示 搜索谓词 的存在性
img_33d02437d135341f0800e3d415312ae8.gif
        Console.WriteLine(
img_33d02437d135341f0800e3d415312ae8.gif            
"\nArray.Exists(StockIDAry, SearchRule): {0}",
img_33d02437d135341f0800e3d415312ae8.gif            Array.Exists(StockIDAry, SearchRule));
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif        
//显示 搜索谓词 是否对数组中所有元素都有效
img_33d02437d135341f0800e3d415312ae8.gif
        Console.WriteLine(
img_33d02437d135341f0800e3d415312ae8.gif            
"\nArray.TrueForAll(StockIDAry, SearchRule): {0}",
img_33d02437d135341f0800e3d415312ae8.gif            Array.TrueForAll(StockIDAry, SearchRule));
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif        
//显示 搜索谓词 找到的数组中的第一个匹配项
img_33d02437d135341f0800e3d415312ae8.gif
        Console.WriteLine(
img_33d02437d135341f0800e3d415312ae8.gif            
"\nArray.Find(StockIDAry, SearchRule): {0}",
img_33d02437d135341f0800e3d415312ae8.gif            Array.Find(StockIDAry, SearchRule));
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif        
//显示  搜索谓词 找到的数组中的最后一个匹配项
img_33d02437d135341f0800e3d415312ae8.gif
        Console.WriteLine(
img_33d02437d135341f0800e3d415312ae8.gif            
"\nArray.FindLast(StockIDAry, SearchRule): {0}",
img_33d02437d135341f0800e3d415312ae8.gif            Array.FindLast(StockIDAry, SearchRule));
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif        
//获取 搜索谓词 找到的数组中的所有匹配项
img_33d02437d135341f0800e3d415312ae8.gif
        Console.WriteLine(
img_33d02437d135341f0800e3d415312ae8.gif            
"\nArray.FindAll(StockIDAry, SearchRule):");
img_33d02437d135341f0800e3d415312ae8.gif        
string[] subArray = Array.FindAll(StockIDAry, SearchRule);
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif        
//调用 Array.ForEach 方法输出所有匹配项
img_33d02437d135341f0800e3d415312ae8.gif
        Console.WriteLine(
img_33d02437d135341f0800e3d415312ae8.gif           
"\nArray.ForEach:");
img_33d02437d135341f0800e3d415312ae8.gif        Array.ForEach(subArray, PrintID);
img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif        Console.ReadLine();
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }

img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif    
//从股票代码的组合中抽取代码的 搜索谓词
img_33d02437d135341f0800e3d415312ae8.gif
    private static bool SearchRule(String s)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif        
if ( s.StartsWith("600") )
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif            
return true;
img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

img_33d02437d135341f0800e3d415312ae8.gif        
else
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif            
return false;
img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

img_105a1e124122b2abcee4ea8e9f5108f3.gif    }

img_33d02437d135341f0800e3d415312ae8.gif
img_33d02437d135341f0800e3d415312ae8.gif    
//显示代码
img_33d02437d135341f0800e3d415312ae8.gif
    private static void PrintID(String s)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
img_33d02437d135341f0800e3d415312ae8.gif        Console.WriteLine(s);
img_105a1e124122b2abcee4ea8e9f5108f3.gif    }

img_05dd8d549cff04457a6366b0a7c9352a.gif}

img_a6339ee3e57d1d52bc7d02b338e15a60.gif

完全的谢幕之前,我们还发现了一个隐藏的谓词“PrintID”:

img_a6339ee3e57d1d52bc7d02b338e15a60.gif Array.ForEach(StockIDAry, PrintID);

PrintID 代码也是一个“谓词”,只是在这里他不是用来做搜索,而是用来处理数据组中的每一个元素。这个方法看上去也非常实用,在需要循环数组元素,做一些事情的时候,可以用现在这种方式了。

剧本下载:/Files/heekui/predication.rar

The End.
 

目录
相关文章
|
NoSQL API
TairSearch:bool联合条件查询
TairSearch是Tair自主研发的高性能、低延时、基于内存的实时全文搜索数据结构,采用和Elasticsearch相似(ES-LIKE)的查询语法。一些用户在使用过程中会咨询到复杂联合查询语句的用法,本篇文章主要介绍如何在tairsearch中使用bool联合条件查询实现一些复杂场景的查询。 ## bool语句详解 bool是TairSearch中支持复杂联合查询的常用语法,主要支持有3种特
146 0
TairSearch:bool联合条件查询
【CCCC】L2-021 点赞狂魔 (25分),map数组,间接排序
【CCCC】L2-021 点赞狂魔 (25分),map数组,间接排序
89 0
L2-027 名人堂与代金券 (25 分)(sort多关键字排序)
L2-027 名人堂与代金券 (25 分)(sort多关键字排序)
105 0
L2-021 点赞狂魔 (25 分)(sort多关键字排序)
L2-021 点赞狂魔 (25 分)(sort多关键字排序)
68 0
|
索引
Elastic实战:nested查询与数组同一元素匹配多个值
之前有同学实际生产中遇到了一个问题,题目本身不涉及生产环境上的问题,纯粹的DSL,但是因为是实际数据,因此数据量上会大很多,也增加了排错的难度。下面我们具体看下这个问题,让大家具体体会下实际生产的问题与训练题之间的区别在哪儿。
52 0
Elastic实战:nested查询与数组同一元素匹配多个值
|
JavaScript 开发者 索引
品牌案例-根据关键字实现数组的过滤|学习笔记
快速学习品牌案例-根据关键字实现数组的过滤
122 0
|
移动开发 缓存 HTML5
是时候学习/推广一波可选链(Optional chaining)和空值合并(Nullish coalescing )了
最近工作中发现团队有些同学不太了解 Optional chaining 和 Nullish coalescing 两个新的操作符,正好推广一波。
是时候学习/推广一波可选链(Optional chaining)和空值合并(Nullish coalescing )了
|
安全 开发者
es6新增的运算符-链判断运算符的诞生[?.]和null的判断运算符??
es6新增的运算符-链判断运算符的诞生[?.]和null的判断运算符??
ES6 数组去重的最佳实践:Set 结合 Array.from() | 拓展运算符结合 Set
一直想写个ES6特性的系列文章,整理了一段时间,不想写概而全的纯理论,只想写一些贴近工作的, 最常用到的,比如块级作用域,箭头函数,字符串模板等等---敬请期待 上面那两个方法并不是万能的,只能作为常规的数组去重,因为涉及到对象或者多维数组的去重, 还是需要其他一些方法来辅助,该遍历遍历,该比较还是得比较。。。。
201 0