“Array”先生和他的新伙伴“谓词”(转)
在讲“Array”先生和他的新伙伴“谓词”之前,让我们先回顾一下常写的一些程序片断。
假定我们有了一个存储股票代码的数组
//声明并构造一个股票代码的组合
string[] StockIDAry = {
"600616",
"600123",
"000002",
"610003",
"600001"
};
string[] StockIDAry = {
"600616",
"600123",
"000002",
"610003",
"600001"
};
如果要判断数组中是否有满足某个条件的值,那么我们常规的写法是这样的:
//判断存在性
foreach (string StockID in StockIDAry)
{
if (s.StartsWith("600"))
{
return true;
}
}
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);
}
}
//找到满足条件的值
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;
}
}
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([搜索的数组],[谓词])
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);
}
}
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