Tag: lambda

Expression.Compile与Lambda的性能,直接与虚拟调用

我很好奇Expression.Compile与代码中的lambda表达式和直接方法使用方式的性能如何,以及直接方法调用与虚方法调用(伪代码): var foo = new Foo(); var iFoo = (IFoo)foo; foo.Bar(); iFoo.Bar(); (() => foo.Bar())(); (() => iFoo.Bar())(); Expression.Compile(foo, Foo.Bar)(); Expression.Compile(iFoo, IFoo.Bar)(); Expression.CompileToMethod(foo, Foo.Bar); Expression.CompileToMethod(iFoo, IFoo.Bar); MethodInfo.Invoke(foo, Foo.Bar); MethodInfo.Invoke(iFoo, IFoo.Bar);

使用LINQ或Lambda从列表中删除实例?

现在我来了一个阶段,将我的所有数据作为缓存(对象)中的列表,我接下来要做的是从列表中删除一些实例。 通常情况下,我会这样删除: List list; List toBeRemovedItems; // populate two lists foreach(T2 item in toBeRemovedItems) { list.Remove(delegate(T one) { // build a condition based on item // return true or false }); } 更具体地说,我实际上构建或填充了动态类(不是正式定义的类)的BeRemvoedItems列表。 例如,T类类似于MyClass,删除代码是: class MyClass { public string Value1 { get; set; } public int Value2 { get; set; } public C ObjectC { […]

匿名方法与lambda表达式

任何人都可以提供匿名方法和lambda表达式之间的简洁区别吗? 匿名方法的用法: private void DoSomeWork() { if (textBox1.InvokeRequired) { //textBox1.Invoke((Action)(() => textBox1.Text = “test”)); textBox1.Invoke((Action)delegate { textBox1.Text = “test”; }); } } 它只是一个普通的lambda表达式被强制类型化的委托,或者它有更多的秘密。 我很清楚一个强类型的代表就像跟随 UpdateTextDelegate mydelegate = new UpdateTextDelegate(MethodName) 足够作为System.Delegate类型的参数,但匿名方法的想法对我来说相当新。

lambda表达式语法与LambdaExpression类

这行代码尝试将lambda表达式分配给LambaExpression类型变量, LambdaExpression expr = n => n; 它失败并出现编译错误消息: 无法将lambda表达式转换为类型’System.Linq.Expressions.LambdaExpression’,因为它不是委托类型 所以它需要是一个委托类型。 从概念上讲,这对我来说似乎很奇怪,因为我可以使用像这样的工厂方法构建一个LambdaExpression实例。 来自MSDN的 Factory Lambda LambdaExpression lambdaExpr = Expression.Lambda( Expression.Add( paramExpr, Expression.Constant(1) ), new List() { paramExpr } ); 那不是代表类型。 这让我们想知道为什么lambda到LambaExpression不起作用?

有人可以用真正的简单语言向我解释什么是封闭?

可能重复: 什么是.NET中的’闭包’? 我目前正在研究lambda表达式,并且关闭这个词仍在继续。 有人可以用真正简单的语言向我解释。

代表和Lambdas和LINQ,哦,我的!

作为一个相当初级的开发人员,我遇到的问题突出了我缺乏经验和我所知的漏洞。 如果这里的序言太长,请原谅。 我发现自己处于一个涉及我需要学习一些新的(对我而来)技术的项目,包括LINQ(对于这个项目来说是OBJECTS和XML)等等。 我读到的所有内容都表明,要使用LINQ,我需要完全理解以下内容(代理,匿名方法和Lambda表达式)。 好的,所以现在很有趣。 我曾经使用过.NET事件模型,因此我已经消费了代表,但是大多数细节都是隐藏的(感谢Microsoft!)。 我理解,在基本层面上,委托实例是指向方法的指针(我知道这种过度简化)。 我知道匿名方法本质上是一种内联的未命名方法,通常(如果不是唯一的话)创建为委托的目标。 我也理解lambdas以不同的方式用于简化语法,并可用于将简单的匿名方法指向委托。 请原谅我,如果我的任何描述都在这里,那么这就是我理解这些主题的基本层面。 所以,挑战: 如果我对这些项目的了解甚至更接近,至少在基本层面上有人能告诉我吗? 我不是在寻找复杂的深奥细节,只是基础(现在)。 在将LINQ应用于项目中以达到合理的效果之前,我需要在多大程度上真正理解这些概念? 我想完全理解它,并愿意花时间。 在我需要完成一些工作之前,我可能没有时间完全理解所有这些东西。 任何人都可以向我指出一些解释这些主题的好文章,并将它们应用到“真实世界”的例子中,这样我就可以了解主题的基础知识和应用它们吗? 我的意思是现实世界,我是如何在“客户和发票”的背景下使用它而不是抽象的“矢量和形状”或“动物和奶牛”。 出于演示目的,这种情况可能有点人为,但希望不是严格的学术性的。 我在网上和书中找到了一些例子,但似乎很少有“简单英语”的解释。 提前感谢您的耐心,时间和专业知识。

.NET / C# – 将列表转换为SortedList

将List转换为SortedList的最佳方法是什么? 没有骑自行车的任何好方法吗? 用OrderBy()做任何聪明的方法吗? WRAP UP请阅读所有答案和评论。

您可以使用LINQ或LAMBDA表达式对一行中的字符串进行逆序处理

并不是说我想要实际使用它(出于很多原因),但出于严格的好奇心,我想知道是否有一种方法可以在一行代码中使用LINQ和/或LAMBDA表达式对字符串进行逆序,而不使用任何代码框架“反向”方法。 例如 string value = “reverse me”; string reversedValue = (….); 和reversedValue将导致“em esrever” 编辑显然,一个不切实际的问题/解决方案我知道这一点,所以不要担心它严格地是围绕LINQ / LAMBDA结构的好奇心问题。

具有OR子句的lambda表达式的LINQ where子句和返回不完整结果的空值

问题简而言之 我们在Where子句中使用了lambda表达式,它没有返回“预期”结果。 快速摘要 在analyzeObjectRepository对象中,某些对象也包含名为Parent的属性中的父关系。 我们正在查询此analyzeObjectRepository以返回一些对象。 详情 下面的代码应该做的是,返回包含ID值的特定对象的根,第一个子节点(直接子节点)和孙子节点。 在下面的代码中,常识说所有使3个单独的OR条件中的任何一个成为真的结果都应该像结果一样返回。 List analysisObjects = analysisObjectRepository .FindAll() .Where(x => x.ID == packageId || x.Parent.ID == packageId || x.Parent.Parent.ID == packageId) .ToList(); 但上面的代码只返回子孙,而没有返回根对象(使用null父值) x.ID == packageId 条件是真的。 只有制作第二个的对象 x.Parent.ID == packageId 第三 x.Parent.Parent.ID == packageId 条款被退回。 如果我们只编写代码以使用下面的代码返回根对象,则返回它,因此我们完全确定analyzeObjectRepository包含所有对象 List analysisObjects = analysisObjectRepository .FindAll() .Where(x => x.ID == packageId ) .ToList(); 但是,当我们将其重写为委托时,我们得到预期的结果,返回所有预期的对象。 […]

C#lambda表达式和IComparer

我使用lambda表达式在C#中排序和搜索数组。 我不想在我的类中实现IComparer接口,因为我需要对多个成员字段进行排序和搜索。 class Widget { public int foo; public void Bar() { Widget[] widgets; Array.Sort(widgets, (a, b) => a.foo.CompareTo(b.foo)); Widget x = new Widget(); x.foo = 5; int index = Array.BinarySearch(widgets, x, (a, b) => a.foo.CompareTo(b.foo)); } } 虽然排序工作正常,但二进制搜索会产生编译错误无法将lambda表达式转换为类型’System.Collections.IComparer ‘,因为它不是委托类型 。 由于某种原因,Sort对IComparer和Comparison都有重载,但BinarySearch只支持IComparer。 经过一些研究,我发现了ComparisonComparer笨重的ComparisonComparer将比较转换为IComparer: public class ComparisonComparer : IComparer { private readonly Comparison comparison; public ComparisonComparer(Comparison […]