随便聊聊Lambda

2024-04-12 21:18
文章标签 聊聊 lambda 随便

本文主要是介绍随便聊聊Lambda,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C#用多了,对于Lambda肯定不陌生,作为创建委托的一种简易方式,使用上确实相当顺手,不过用的多了,难免也会踩坑,下面这个坑可能就有不少朋友踩过:

var count = 8;
var Func = new List<Action>(count);for (int i = 0; i < count; ++i)
{Func.Add(() => { Console.WriteLine(i); });
}foreach (var action in Func)
{action();
}

代码很简单,使用List缓存了一些委托然后执行,那么执行的结果是什么呢?一些朋友可能会脱口而出: 0 1 2 3 4 5 6 7
可惜正确答案却是: 8 8 8 8 8 8 8 8 ! 原因在于Lambda表达式中捕获的i是同一个引用变量!

代码改成这样也许会更清晰一些(这里i被写在了循环外):

var count = 8;
var Func = new List<Action>(count);int i = 0;
for (i = 0; i < count; ++i)
{Func.Add(() => { Console.WriteLine(i); });
}foreach (var action in Func)
{action();
}

为了避免这个问题,我们需要创建不同的局部变量(这里我们通过创建多份index来缓存中间数值):

var count = 8;
var Func = new List<Action>(count);for (int i = 0; i < count; ++i)
{int index = i;Func.Add(() => { Console.WriteLine(index); });
}foreach (var action in Func)
{action();
}

实际上这个坑在C#5之后就被填上了,只是现实来看,你可能还没法用上C#5(例如Unity目前仍不支持),所以在平时使用Lambda时还是要多留下心~

OK,闲聊结束,下次再见吧~

这篇关于随便聊聊Lambda的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898263

相关文章

Python19 lambda表达式

在 Python 中,lambda 表达式是一个小型匿名函数,通常用于实现简单、单行的函数。lambda 函数可以接受任意数量的参数,但只能有一个表达式。 基本语法: lambda arguments: expression 这里,arguments 是传递给 lambda 的参数,expression 是关于这些参数的表达式,它的计算结果就是 lambda 函数的返回值。 使用

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天:2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽(优点:松散耦合)帮助文档的查阅方法-②找信号函数的方法找槽函数的方法 自定义信号和槽 lambda表达式练习MenuTool Qt creator 快捷键 运行:ctrl

软考高级论文真题“论大数据lambda架构”

论文真题 大数据处理架构是专门用于处理和分析巨量复杂数据集的软件架构。它通常包括数据收集、存储、处理、分析和可视化等多个层面,旨在从海量、多样化的数据中提取有价值的信息。Lambda架构是大数据平台里最成熟、最稳定的架构,它是一种将批处理和流处理结合起来的大数据处理系统架构,其核心思想是将批处理作业和实时流处理作业分离,各自独立运行,资源互相隔离,解决传统批处理架构的延迟问题和流处理架构的准

学懂C#编程:常用高级技术——学会Lambda表达式的应用(二)

上一篇介绍了Lambda基础的知识,接着我们通过讲解Lambda的几种应用场景来彻底学懂Lambda在编程中的应用。 Lambda表达式在C#中非常灵活,可以用在多种场合。以下是一些Lambda表达式示例,帮助你更全面地理解其用途: 1. 数组过滤(使用Where) int[] numbers = { 1, 2, 3, 4, 5, 6 };var evenNumbers = numbers

使用 C++11 Lambda 表达式在 Qt 中连接信号与槽

在 Qt 使用 C++11 引入的 lambda 表达式来简化信号与槽的连接已经成为一种不错的选择。本文将通过一个简单的例子来展示如何使用 lambda 表达式来连接 QAction 的信号与槽。 传统的连接方式 首先,看看传统的连接方式: QAction* action = foo->addAction(tr("Some Action"));connect(action, SIGNAL(

聊聊你不知道的建造者设计模式

距离上次写博客的距离也快一个月了,最近打算跟大家分享一下建造者模式,其实这个模式以前也介绍过,当时只是介绍它在android项目中广泛被应用于创建对象的链式调用,并没有深入的去说明其中的逻辑性,由于这次跟王大哥讨论建造者模式,我还是决定写一篇博客记录一下自己对建造者模式的理解,各位可以提出不同的观点,相互交流 1:Builder 设计模式 1.1:为什么要用建造者模式1.2:建造者模式的几个

Lambda 表达式是为了解决啥问题,语法,使用规则,c++中的常用用法示例

2024/6/21 11:20:09 Lambda 表达式的主要目的是为了简化函数对象(或称为函数符)的创建和使用。传统的函数对象需要定义一个具名的类或者使用函数指针,而Lambda 表达式可以在需要时直接定义一个匿名函数,从而减少代码量和提高代码的可读性。 Lambda 表达式的语法 在 C++ 中,Lambda 表达式的基本语法如下: [capture list] (parameters

学懂C#编程:常用高级技术——委托(Delegate)应用场景——委托与Lambda表达式的结合使用详解

在C#中,委托与Lambda表达式的结合使用是现代编程实践中的一个重要且强大的特性,它极大地提高了代码的简洁性和可读性。下面将详细讲解这两个概念如何协同工作,以及如何在实际编程中有效利用它们。 委托基础         委托是C#中的一种引用类型,它允许封装一个方法的引用。你可以把它想象成一个可以存储和调用方法的变量。委托定义了方法的签名,包括返回类型、参数数量、参数类型等。

聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例

前言 dynamic 是一种有别于传统变量类型的动态类型声明,刚开始接触可能在理解上会有些困难,可以简单地把它理解为一个盲盒,你可以任意猜测盒子有什么东西,并认为这些东西真正存在而进行处理,等到真正打开时,才能真正确定这些东西是不是真的存在。 所以,当使用 dynamic 声明一个变量时,编译器不会去检查该变量的成员或方法的有效性,换句话说,你可以调用任意成员或方法,即使它们不存在,编译器