委托和Lambda那点事(一步步集合案例分析,为什么使用委托 3解)

案例1:<原始的方法>

复制代码
static void Main(string[] args)
{
//委托的比较
//常规方式
int[] numbers = { 1,2,3,4,5,6,7,8,9,10};
List<int> evenNumber = new List<int>();//偶数
List<int> oddNumber = new List<int>();//奇数
List<int> over5Number = new List<int>();//大于5的
//判断
foreach (int i in numbers)
{
if (IsEven(i))
{
evenNumber.Add(i);
}
if (IsOdd(i))
{
oddNumber.Add(i);
}
if (IsOver5(i))
{
over5Number.Add(i);
}
}
//输出显示
Display(evenNumber,oddNumber,over5Number);


//如何做到 判断+输出显示在一起呢?思路:就是要把Bool方法作为一个参数带入方法内

}

//写成方法有助于处理多个对象,不用每个对象都写一次函数,直接调用即可
static bool IsEven(int number)
{
return (number % 2 == 0);
}

static bool IsOdd(int number)
{
return (number % 2 == 1);
}

static bool IsOver5(int number)
{
return (number > 5);
}

static void Display(List<int> list1,List<int> list2,List<int> list3)//输出方法
{
Console.WriteLine("The list1 is :");
foreach(int i in list1)
{
Console.Write(i+"");
}
Console.WriteLine();
Console.WriteLine("The list2 is :");
foreach(int i in list2)
{
Console.Write(i+"");
}
Console.WriteLine();
Console.WriteLine("The list3 is :");
foreach(int i in list3)
{
Console.Write(i+"");
}

}
}
复制代码



委托方法:
 

复制代码
class Program
{
delegate bool NumerPredicate(int number);//类似于判断方法
static void Main(string[] args)
{
//委托的比较
//常规方式
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List<int> evenNumber = Display_Predicate(numbers,IsEven);//偶数,用变量引用IsEven方法
List<int> oddNumber = Display_Predicate(numbers,IsOdd);//奇数
List<int> over5Number = Display_Predicate(numbers,IsOver5);//大于5的



//如何做到 判断+输出显示在一起呢?思路:就是要把Bool方法作为一个参数带入方法内

}

//写成方法有助于处理多个对象,不用每个对象都写一次函数,直接调用即可
static bool IsEven(int number)
{
return (number % 2 == 0);
}

static bool IsOdd(int number)
{
return (number % 2 == 1);
}

static bool IsOver5(int number)
{
return (number > 5);
}
static List<int> Display_Predicate(int[] array, NumerPredicate predicate)
{
List<int> result = new List<int>();
foreach (int i in array)
{
if (predicate(i))//用predicate变量引用方法
{
result.Add(i);
}
}

foreach (int i in result)
{
Console.Write(i + "");
}
Console.WriteLine();
return result;
}
}
复制代码




另一解:<Lambda表达式>

复制代码
class Program
{
delegate bool NumerPredicate(int number);//类似于判断方法
static void Main(string[] args)
{
//NumerPredicate evenPredicate = IsEven;
//Console.WriteLine(evenPredicate(4));//true
NumerPredicate evenPredicate=number => (number % 2==0);//偶数
NumerPredicate oddPredicate = number => (number % 2 == 1);//判断是否是奇数,用委托的变量引用Lambda表达式这个方法
NumerPredicate over5Predicate = number => (number > 5);
Console.WriteLine(oddPredicate(5));//true
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List<int> evenNumber = Display_Predicate(numbers, evenPredicate);//偶数,用变量引用IsEven方法
List<int> oddNumber = Display_Predicate(numbers, oddPredicate);//奇数
List<int> over5Number = Display_Predicate(numbers, over5Predicate);//大于5的




}

//写成方法有助于处理多个对象,不用每个对象都写一次函数,直接调用即可

static List<int> Display_Predicate(int[] array, NumerPredicate predicate)
{
List<int> result = new List<int>();
foreach (int i in array)
{
if (predicate(i))//用predicate变量引用方法
{
result.Add(i);
}
}

foreach (int i in result)
{
Console.Write(i + "");
}
Console.WriteLine();
return result;
}
}
复制代码



posted @   Anleb  阅读(693)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示