Tag: lambda

我可以将局部变量捕获为LINQ表达式作为常量而不是闭包引用吗?

我想说 int x = magic(), y = moremagic(); return i => i + (x/y); 并将x捕获为常量而不是变量引用。 这个想法是x永远不会改变,所以当表达式稍后编译时,编译器可以进行常量折叠并产生更有效的代码 – 即计算x/y一次而不是每次调用,通过指针解引用到闭包记录中。 无法在方法中将x标记为只读,并且编译器不够聪明,无法检测到在创建表达式后它不会更改。 我不想手工构建表达式。 有什么好主意吗? 更新 :我最终使用了奇妙的LinqKit来构建一个部分评估器,它将执行我想要的替换。 只有当您知道相关引用不会改变时,转换才是安全的,但它适用于我的目的。 可以通过在其中添加一个或多个额外的检查来限制部分评估仅限于您控制的闭包的直接成员,这在检查LinqKit中提供的示例代码时非常明显。 /// Walks your expression and eagerly evaluates property/field members and substitutes them with constants. /// You must be sure this is semantically correct, by ensuring those fields (eg references to […]

.NET:延迟后在UI线程上执行lambda的最佳方法?

我遇到了一个需要在延迟后在UI线程上运行lambda表达式的情况。 我想到了几种方法,并最终确定了这种方法 Task.Factory.StartNew(() => Thread.Sleep(1000)) .ContinueWith((t) => textBlock.Text=”Done”,TaskScheduler.FromCurrentSynchronizationContext()); 但我想知道是否有一种更容易错过的方法。 对更短,更简单或更简单的技术的任何建议? 假设.NET 4可用。

为什么lambda表达式没有“实习”?

字符串是引用类型,但它们是不可变的。 这允许它们被编译器实现; 在出现相同的字符串文字的地方,可以引用相同的对象。 委托也是不可变的引用类型。 (使用+=运算符向多播委托添加方法构成赋值 ;这不是可变性。)而且,就像字符串一样,有一种“文字”方式来表示代码中的委托,使用lambda表达式,例如: Func func = () => 5; 该语句的右侧是一个类型为Func的表达式; 但我没有在任何地方显式调用Func构造函数(也不会发生隐式转换)。 所以我认为这基本上是一个文字 。 我在这里误解了我对“文字”的定义吗? 无论如何,这是我的问题。 如果我有两个变量,比如Func类型,我将两个相同的lambda表达式分配给: Func x = () => 5; Func y = () => 5; …什么阻止编译器将它们视为相同的Func对象? 我问,因为C#4.0语言规范的第6.5.1节明确指出: 将具有相同(可能为空)的捕获的外部变量实例集的语义相同的匿名函数转换为相同的委托类型是允许(但不是必需的)返回相同的委托实例。 这里使用语义相同的术语来表示在所有情况下,在给定相同参数的情况下,匿名函数的执行将产生相同的效果。 当我读到它时,这让我感到惊讶; 如果明确允许这种行为,我希望它能够实现。 但似乎并非如此。 事实上,这已经让很多开发人员陷入困境,尤其是 当lambda表达式用于成功附加事件处理程序而不能删除它们时。 例如: class EventSender { public event EventHandler Event; public void Send() { EventHandler handler = […]

要在Select()查询中使用的Lambda表达式

我正在尝试构建一个lambda表达式,包含两个赋值(如下图所示),然后我可以传递给Queryable.Select()方法。 我试图将一个字符串变量传递给一个方法,然后使用该变量来构建lambda表达式,以便我可以在LINQ Select查询中使用它。 我的理由是我有一个包含许多列名的SQL Server数据源,我正在创建一个图表应用程序,允许用户通过输入列名来选择他们想要查看的实际数据列。我的图表的y轴,x轴始终是DateTime。 因此,他们基本上可以根据DateTime值选择他们绘制的数据(它是数据仓库类型的应用程序)。 例如,我有一个类来存储检索到的数据,因此用作以下图表来源: public class AnalysisChartSource { public DateTime Invoicedate { get; set; } public Decimal yValue { get; set; } } 我(纯实验)使用String值为Where子句构建了一个表达式树,并且工作正常: public void GetData(String yAxis) { using (DataClasses1DataContext db = new DataClasses1DataContext()) { var data = this.FunctionOne().AsQueryable(); //just to get some temp data in…. ParameterExpression pe = Expression.Parameter(typeof(AnalysisChartSource), “p”); […]

表达Lambda与Statement Lambda

从根本上说,单行表达式lambda和语句lambda之间有什么区别吗? 请使用以下代码,例如: private delegate void MyDelegate(); protected static void Main() { MyDelegate myDelegate1 = () => Console.WriteLine(“Test 1”); MyDelegate myDelegate2 = () => { Console.WriteLine(“Test 2”); }; myDelegate1(); myDelegate2(); Console.ReadKey(); } 虽然我更喜欢第一个,因为我发现括号是丑陋的,两者之间是否有任何不同(除了要求多行语句括号的明显部分)?

在Linq中使用Expression <Func >包含扩展名

使用以下示例我想在我的Contains方法中使用我的Expression ,让它使用EF将查询传递到sql server。 我怎样才能使这个正常工作? void Main() { IQueryable qry = GetQueryableItemsFromDB(); var filtered = qry.Filter(p=>p.CompanyId); } public static class Ext { public static IQueryable Filter(this IQueryable items, Expression<Func> resolveCompanyIdExpression) { IEnumerable validComps = GetCompanyIdsFromDataBase(); var exp = Expression.Lambda<Func>( Expression.Call(typeof(Queryable),”Contains”, new[] { typeof(Company) }, Expression.Constant(validComps), resolveCompanyIdExpression.Body), resolveCompanyIdExpression.Parameters[0]); return items.Where(exp); } public static IQueryable Filter(this IQueryable items, […]

将Expression <Func >动态转换为Expression <Func

我找不到从Expression <Func >转换为Expression <Func >的方法。 因为我使用了大量的reflection,实际上,我真正需要的是一种采用类型参数并执行转换的方法。 public object Convert(Expression<Func> expr, Type t); T2来自T1 public class T1 { int FamilyId {get; set;} } public class T2 : T1 { … other properties } 我在基类上定义了一个filter表达式 Expression<Func> filter = p => p.FamilyId == [some value] 我想申请List

表达式树和调用委托

所以我有一个delegate指向一些我在第一次创建delegate对象时实际上并不知道的函数。 稍后将该对象设置为某个函数。 然后我还想创建一个表达式树,用参数调用委托(为了这个问题,参数可以是5 )。 这是我正在努力的一点; 下面的代码显示了我想要的但它没有编译。 Func func = null; Expression expr = Expression.Invoke(func, Expression.Constant(5)); 对于这个例子我可以这样做(这很实用,因为我需要在运行时构建表达式树): Func func = null; Expression<Func> expr = () => func(5); 这使expr成为: () => Invoke(value(Test.Program+c__DisplayClass0).func, 5) 这似乎意味着要使用delegate func ,我需要生成value(Test.Program+c__DisplayClass0).func位。 那么,我怎样才能创建一个调用委托的表达式树?

如何从c#中的MethodCallExpression调用该方法

我有一个方法调用表达式并尝试调用该方法。 我找到了一种方法,但是我在检索参数值方面遇到了问题,因为不是每个参数都用ConstantExpression描述。 Expression<Action> = t => t.DoSomething(Par0, Par1, Par2); MethodCallExpression methodCallExpression = selector.Body as MethodCallExpression; // get the information which is needed to invoke the method from the provided // lambda expression. MethodInfo methodInfo = methodCallExpression.Method; object[] arguments = methodCallExpression.Arguments.OfType() .Select(p => p.Value).ToArray(); // invoke the expression on every item within the enumerable foreach (TSource […]

C#lambda表达式作为函数参数

我最近一直在忙着研究lambda表达式,并且我有一些特定的function,我一直想学习,但似乎无法做出正面或反面。 假设我的代码中有以下逻辑: List foo; // assuming this is populated string[] bar = foo.Select(x => x.StringProperty).ToArray(); 现在,我想将整个操作抽象为一个处理程序方法,以便我可以这样做: string[] bar = MakeArray(foo, x => x.StringProperty); int[] foobar = MakeArray(foo, x => x.IntegerProperty); 我将如何编写该方法的主体? 我预见签名就像: U[] MakeArray( /* some lambda magic? */ ) where T : IEntity {} 但我不知道如何指定我期望lambda表达式作为方法参数,以及它如何准确转换为方法体。 任何人都可以告诉我如何创建上面的MakeArray()函数? 我很确定,一旦我看到它是如何完成的,我就可以从那里拿起它。 编辑 正如评论中指出的那样, MakeArray()需要对IEnumerable的引用。 更新以反映这一点。