“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.
 

目录
相关文章
|
6月前
|
存储 分布式计算 DataWorks
MaxCompute产品使用合集之要存储用户的下单所有产品,然后查询时要进行产品分组的,一般这种字段要使用ARRAY还是MAP
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
6月前
|
SQL 算法 数据挖掘
深入解析力扣183题:从不订购的客户(LEFT JOIN与子查询方法详解)
深入解析力扣183题:从不订购的客户(LEFT JOIN与子查询方法详解)
|
算法 Python
数组倍增(Array Doubling
数组倍增(Array Doubling)是一种常见的算法技术,用于解决数组相关的查找、插入、删除等问题。该技术的核心思想是将数组的大小乘以 2,新数组的长度是原数组长度的两倍,然后将原数组中的元素复制到新数组中。在某些情况下,这种技术可以提高算法的效率,尤其是对于动态数据结构的问题。
246 1
【 腾讯精选练习 50 题】06—删除排序数组中的重复项【简单】
【 腾讯精选练习 50 题】06—删除排序数组中的重复项【简单】
|
机器学习/深度学习 人工智能 C++
猿创征文|【C++之new和delete运算符】创建数组
猿创征文|【C++之new和delete运算符】创建数组
|
JavaScript 前端开发 搜索推荐
不好意思!🍎我真的只会用 Array.prototype.sort() 写✍排序!
不好意思!🍎我真的只会用 Array.prototype.sort() 写✍排序!
79 0
|
NoSQL API
TairSearch:bool联合条件查询
TairSearch是Tair自主研发的高性能、低延时、基于内存的实时全文搜索数据结构,采用和Elasticsearch相似(ES-LIKE)的查询语法。一些用户在使用过程中会咨询到复杂联合查询语句的用法,本篇文章主要介绍如何在tairsearch中使用bool联合条件查询实现一些复杂场景的查询。 ## bool语句详解 bool是TairSearch中支持复杂联合查询的常用语法,主要支持有3种特
194 0
TairSearch:bool联合条件查询
L2-027 名人堂与代金券 (25 分)(sort多关键字排序)
L2-027 名人堂与代金券 (25 分)(sort多关键字排序)
138 0
L2-021 点赞狂魔 (25 分)(sort多关键字排序)
L2-021 点赞狂魔 (25 分)(sort多关键字排序)
91 0