“Array”先生和他的新伙伴“谓词”(转)

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

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

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

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

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

出处 http://i.mop.com/vikings/blog/2007/06/14/4356716.html

posted @ 2008-11-11 13:27  小奇偶  阅读(120)  评论(0编辑  收藏  举报