Func 接受输入参数(可多个残数),并且返回指定的输出TResult
Action接受参数(只有一个),返回void
Predicate 有一个输入参数,如果输入参数符合指定的条件,返回true,否则fasle.
具体代码实现如下:
一,public delegate TResult Func<in T, out TResult>( T arg )
封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。
实现一,显式声明自定义委托实现字符转换
using System;
delegate string ConvertMethod(string inString);
public class DelegateExample
{
public static void Main()
{
// 转成大写
ConvertMethod convertMeth = UppercaseString;
string name = "Dakota";
// Use delegate instance to call UppercaseString method
Console.WriteLine(convertMeth(name));
}
private static string UppercaseString(string inputString)
{
return inputString.ToUpper();
}
}
使用匿名方法:
using System;
public class DelegateExample
{
public static void Main()
{
// 转成大写
Func<string,string> convertMeth = delegate(string inputstr)
{
return inputstr.ToUpper();
}
string name = "Dakota";
Console.WriteLine(convertMeth(name));
}
}
使用lambda表达式
using System;
public class lambdaExample
{
public static void Main()
{
// 转成大写
Func<string,string> convert = inputstr=>inputstr.ToUpper();
string name = "Dakota";
Console.WriteLine(convert(name));
}
}
示例again
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
static class Func
{
static void Main(string[] args)
{
Func<string, string> selector = str => str.ToUpper();
// 建立一个字符串数组
string[] words = { "orange", "apple", "Article", "elephant" };
IEnumerable<String> aWords = words.Select(selector);
//输出
foreach (String word in aWords)
Console.WriteLine(word);
}
}
二,public delegate void Action<in T>( T obj )
该方法只有一个参数并且不返回值,
T为此委托封装的方法的参数类型。此类型参数是逆变。
using System;
using System.Windows.Forms;
public class TestAnonMethod
{
public static void Main()
{
Action<string> messageTarget;
if (Environment.GetCommandLineArgs().Length > 1)
messageTarget = delegate(string s) { MessageBox.Show(s); };
else
messageTarget = delegate(string s) { Console.WriteLine(s); };
//lambda表达式
if (Environment.GetCommandLineArgs().Length > 1)
messageTarget = s => MessageBox.Show(s);
else
messageTarget = s => Console.WriteLine(s);
messageTarget("Hello, World!");
}
}
//打印list<string>
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<String> names = new List<String>();
names.Add("Bruce");
names.Add("Alfred");
names.Add("Tim");
names.Add("Richard");
// 使用print答应list的值
names.ForEach(Print);
// 同上,使用匿名方法
names.ForEach(delegate(String name)
{
Console.WriteLine(name);
});
//同上, lambda表达式
names.ForEach(name=>console.WriteLine(name));
}
private static void Print(string s)
{
Console.WriteLine(s);
}
}
Predicate 声明:public delegate bool Predicate<in T>(T obj)
表示定义一组条件并确定指定对象是否符合这些条件的方法。
public class HockeyTeam
{
private string _name;
private int _founded;
public HockeyTeam(string name, int year)
{
_name = name;
_founded = year;
}
public string Name
{
get { return _name; }
}
public int Founded
{
get { return _founded; }
}
}
public class Example
{
public static void Main()
{
List<HockeyTeam> teams = new List<HockeyTeam>{
new HockeyTeam("Detroit Red Wings", 1926),
new HockeyTeam("Chicago Blackhawks", 1926),
new HockeyTeam("San Jose Sharks", 1991),
new HockeyTeam("Montreal Canadiens", 1909),
new HockeyTeam("St. Louis Blues", 1967) };
//1 >>1,2,3三种方式都可实现,选择其中一种就行。
Random rnd = new Random();
int[] years = { 1920, 1930, 1980, 2000 };
int foundedBeforeYear = years[rnd.Next(0, years.Length)];
Console.WriteLine("Teams founded before {0}:", foundedBeforeYear);
foreach (var team in teams.FindAll(x => x.Founded <= foundedBeforeYear))
Console.WriteLine("{0}: {1}", team.Name, team.Founded);
//2 //如果找到与指定谓词定义的条件匹配的第一个元素Array.Find(HockeyTeam,Predicate<HockeyTema>)
Predicate<HockeyTeam> find = FindTeam;
HockeyTeam ht = Array.Find(teams.ToArray(), find);
Console.WriteLine("{0}: {1}", ht.Name, ht.Founded);
//3
//Random rnd = new Random();
//int[] years = { 1920, 1930, 1980, 2000 };
//int foundedBeforeYear = years[rnd.Next(0, years.Length)];
//HockeyTeam ht4 = teams.Find(t => t.Founded < foundedBeforeYear);
//Console.WriteLine("{0}: {1}", ht4.Name, ht4.Founded);
}
private static bool FindTeam(HockeyTeam ht)
{
Random rnd = new Random();
int[] years = { 1920, 1930, 1980, 2000 };
int foundedBeforeYear = years[rnd.Next(0, years.Length)];
return ht.Founded <= foundedBeforeYear;
}
}