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"
                              }
;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章