Array先生的新伙伴:谓词

内容转自:http://www.cnblogs.com/heekui/archive/2007/01/13/619624.html

 

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

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

如果要判断数组中是否有满足某个条件的值,那么我们常规的写法是这样的:如果要找出数组中满足某个条件的元素,再组合成新的数组,你可能会这样写:

         // 判断存在性
         foreach  ( string  StockID  in  StockIDAry)
        
{
            
if (s.StartsWith("600"))
            
{
                
return true;
            }

        }

 

        ArrayList aryLst  =   new  ArrayList();

        
// 找到满足条件的值
         foreach  ( string  StockID  in  StockIDAry)
        
{
            
if (s.StartsWith("600"))
            
{
                aryLst.Add(s);
            }

        }

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

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

 

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

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

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

        
else
        
{
            
return false;
        }

    }

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

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

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

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

using  System;

public   class  Example
{
    
public static void Main()
    
{
        SearchInStockIDAry();
    }


    
private static void SearchInStockIDAry()
    
{
        
//声明并构造一个股票代码的组合
        string[] StockIDAry = 
                               
"600616"
                               
"600123",   
                               
"000002",
                               
"610003"
                               
"600001"
                              }
;

        Console.WriteLine();

        
//显示组合中每个值
        foreach (string StockID in StockIDAry)
        
{
            Console.WriteLine(StockID);
        }


        
//显示 搜索谓词 的存在性
        Console.WriteLine(
            
"/nArray.Exists(StockIDAry, SearchRule): {0}",
            Array.Exists(StockIDAry, SearchRule));

        
//显示 搜索谓词 是否对数组中所有元素都有效
        Console.WriteLine(
            
"/nArray.TrueForAll(StockIDAry, SearchRule): {0}",
            Array.TrueForAll(StockIDAry, SearchRule));

        
//显示 搜索谓词 找到的数组中的第一个匹配项
        Console.WriteLine(
            
"/nArray.Find(StockIDAry, SearchRule): {0}",
            Array.Find(StockIDAry, SearchRule));

        
//显示  搜索谓词 找到的数组中的最后一个匹配项
        Console.WriteLine(
            
"/nArray.FindLast(StockIDAry, SearchRule): {0}",
            Array.FindLast(StockIDAry, SearchRule));

        
//获取 搜索谓词 找到的数组中的所有匹配项
        Console.WriteLine(
            
"/nArray.FindAll(StockIDAry, SearchRule):");
        
string[] subArray = Array.FindAll(StockIDAry, SearchRule);

        
//调用 Array.ForEach 方法输出所有匹配项
        Console.WriteLine(
           
"/nArray.ForEach:");
        Array.ForEach(subArray, PrintID);

        Console.ReadLine();
    }


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

        
else
        
{
            
return false;
        }

    }


    
//显示代码
    private static void PrintID(String s)
    
{
        Console.WriteLine(s);
    }

}

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

Array.ForEach(StockIDAry, PrintID);

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

         // 声明并构造一个股票代码的组合
         string [] StockIDAry  =  
                               
"600616"
                               
"600123",   
                               
"000002",
                               
"610003"
                               
"600001"
                              }
;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值