內容轉自:http://www.cnblogs.com/heekui/archive/2007/01/13/619624.html
在講“Array”先生和他的新夥伴“謂詞”之前,讓我們先回顧一下常寫的一些程序片斷。
假定我們有了一個存儲股票代碼的數組
如果要判斷數組中是否有滿足某個條件的值,那麼我們常規的寫法是這樣的:如果要找出數組中滿足某個條件的元素,再組合成新的數組,你可能會這樣寫:
foreach (string StockID in StockIDAry)
{
if (s.StartsWith("600"))
{
return true;
}
}
//找到滿足條件的值
foreach (string StockID in StockIDAry)
{
if (s.StartsWith("600"))
{
aryLst.Add(s);
}
}
諸如此類,根據一個條件來進行數組循環,獲取一個判斷,或者一個結果元素,或者結果數組。寫法也大同小異的差不多。
善良的微軟總是爲我們程序員着想的,爲了減少這種重複的手工勞動,在.net framework 2.0裏,推出了 謂詞 這個概念。
“謂詞”從語文上講就是:作一個動作的詞語
那麼,謂詞這玩意拿來做什麼呢?存在必有理。我們先看上面兩段程序用了謂詞之後的代碼段:
不好意思還沒完,我們的主角“謂詞”先生還沒登場,且看
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([搜索的數組],[謂詞])
完整的大戲劇本在這裏。戲怎麼演,你們自己選擇:
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”:
PrintID 代碼也是一個“謂詞”,只是在這裏他不是用來做搜索,而是用來處理數據組中的每一個元素。這個方法看上去也非常實用,在需要循環數組元素,做一些事情的時候,可以用現在這種方式了。
string[] StockIDAry = {
"600616",
"600123",
"000002",
"610003",
"600001"
};