Tag: lambda

c#exit使用lambda的genericsForEach

有谁知道是否可以退出使用lambda的通用ForEach? 例如 someList.ForEach(sl => { if (sl.ToString() == “foo”) break; // continue processing sl here // some processing code } ); 这段代码本身不会编译。 我知道我可以使用常规foreach但为了保持一致性我想使用lambda。 非常感谢。

Lambda表达式<T,Func >和MethodInfo

在将项目从VS2010迁移到VS2012时,我遇到了以下问题。 该项目使用了很多reflection,为了从接口获取MethodInfo,放置了以下代码: Expression<Func<ITest, Func>> expression = scv => scv.Get; UnaryExpression unaryExpression = expression.Body as UnaryExpression; MethodCallExpression methodCallExpression = unaryExpression.Operand as MethodCallExpression; ConstantExpression constantExpression = methodCallExpression.Arguments[2] as ConstantExpression; MethodInfo myMethod = constantExpression.Value as MethodInfo; 使用VS2010编译时效果很好,但是如果使用针对.Net 4.0的VS2012编译代码,则methodCallExpression.Arguments.Count()为2。 反编译后,我注意到编译器为同一个表达式生成了不同的代码。 这是一个设计问题,因为设计不应该像methodCallExpression.Arguments [2]中的数字2那样继续传递“幻数”。 我尝试使用以下方法找到解决方案: MethodCallExpression outermostExpression = expression .Body as MethodCallExpression; MethodInfo myMethod = outermostExpression.Method; 但是outermostExpression为null。 最后,我让它改变了表达式如下: Expression<Func> expression = […]

渴望加载多对多 – EF Core

您好我有很多关系设置如下。 public class order { public int id { get; set; } public virtual ICollection Products { get; set; } } public class product { public int id { get; set; } public virtual ICollection Orders { get; set; } } public class OrderProducts { public int OrderId { get; set; } public virtual Order […]

按时间排序日期时间列表

我有一个日期时间列表,如果可能的话,我想使用lambda表达式对其进行排序。 我的列表: 6/19/1979 8:00:00 AM 5/5/1980 7:00:00 PM 10/20/1982 5:00:00 PM 1/4/1984 6:00:00 AM 输出应按以下顺序排列: 1/4/1984 6:00:00 AM 6/19/1979 8:00:00 AM 10/20/1982 5:00:00 PM 5/5/1980 7:00:00 PM

为什么VB中的lambda表达式与C#不同?

我刚刚遇到NHibernate中的一个错误,该错误恰好已经被提出: https : //nhibernate.jira.com/browse/NH-2763 我不确定这是否适用于枚举以外的任何其他内容,但是当使用VB中的Lambda时,它看起来与C#中的相同Lambda不同。 C#: Where(x => x.Status == EmployeeStatus.Active) VB Where(Function(x) x.Status = EmployeeStatus.Active) 就我所知,它们是一样的吗? (我的VB不是很好) 如果我在同一行代码上放置一个断点,那么上面的代码将被传入。 在C#中我得到: 在VB版本传入的同一行,我得到: 这是我做错了吗? 结果是否相同,只是在C#/ VB之间显示不同? 编辑:好的,所以它们显示不同,但它们不能相同,因为NHibernate无法处理它。 NHibernate完全处理了C#版本,VB版本在抛出以下exception时解决: NHibernate StackTrace: at NHibernate.Impl.ExpressionProcessor.FindMemberExpression(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 168 at NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 323 at NHibernate.Impl.ExpressionProcessor.ProcessSimpleExpression(BinaryExpression be) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line 316 at NHibernate.Impl.ExpressionProcessor.ProcessBinaryExpression(BinaryExpression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\ExpressionProcessor.cs:line […]

C#:是否可以在匿名方法中声明局部变量?

可以在匿名c#方法中使用局部变量,即在以下代码中我只想执行一次计数。 IQueryable linq = db.Enquiries; if(…) linq = linq.Where(…); if(…) linq = linq.Where(e => (x <= (from p in db.Orders where p.EnquiryId == e.Id select p).Count() && (from p in db.Orders where p.EnquiryId == e.Id select p).Count() <= y)); if(…) linq = linq.Where(…); var result = (from e in linq select e); 匿名函数是否有“让”? 更新:请注意,我在此语句后添加了几个Where子句,因此无法使用select关闭。 /尼尔斯

C# – 如何将’out’参数传递给lambda表达式

我有一个带有以下签名的方法: private PropertyInfo getPropertyForDBField(string dbField, out string prettyName) 在其中,我根据给定的dbField找到关联值dbField 。 然后我想找到名称为prettyName所有属性(如果有的prettyName ,所以我试图执行以下操作: IEnumerable matchingProperties = getLocalProperties().Where(prop => prop.Name.Equals(prettyName) ); 但是,这会产生以下错误: 不能在匿名方法,lambda表达式或查询表达式中使用ref或out参数’prettyName’ 在我试图在Where lambda参数中使用prettyName的方法中, prettyName肯定是初始化的。 如果prettyName无法初始化为有效值,则return 。 我可以在这里做一些技巧让我在lambda表达式中使用prettyName吗? 编辑:如果重要的话,我正在使用.NET 3.5。

C#编译器或JIT可以优化lambda表达式中的方法调用吗?

我在另一个StackOverflow问题开始( 在评论中 )的讨论后开始这个问题,我很想知道答案。 考虑以下表达式: var objects = RequestObjects.Where(r => r.RequestDate > ListOfDates.Max()); 在这种情况下,将ListOfDates.Max()的评估移出Where子句会有任何(性能)​​优势,还是1.编译器或2. JIT优化它? 我相信C#只会在编译时进行常量折叠,并且可以认为ListOfDates.Max()在编译时是不可知的,除非ListOfDates本身在某种程度上是常量。 也许还有另一个编译器(或JIT)优化,确保只评估一次?

从给定的Type创建表达式<Func >

我希望通过在代码中构建表达式动态地使用CsvHelper,代码表示给定类型的属性成员访问。 我试图传递这些表达式的方法具有以下签名: public virtual CsvPropertyMap Map( Expression<Func> expression ) { // } 因此,您通常会调用它,对于您要映射的任何给定类型,如下所示(对于具有名为’stringProperty’的属性的类型): mapper.Map(x => x.StringProperty); 传入lambda,内部转换为Expression<Func> 我试图使用表达式在代码中创建此表达式。 在编译时它一切正常(因为它返回一个Expression<Func> ),但在运行时我得到一个exception’不是成员访问’。 这是一个代码,它接受一个PropertyInfo对象来表示我想要映射的属性: private Expression<Func> CreateGetterExpression( PropertyInfo propertyInfo ) { var getter = propertyInfo.GetGetMethod(); Expression<Func> expression = m => getter.Invoke( m, new object[] { } ); return expression; } 基本上,我如何在代码中正确构建表达式?

传递* Awaitable *匿名函数作为参数

代码优先。 这就是我想要做的。 我很接近,但我想我只需要修改我在UpdateButton方法中定义参数的方式。 private async void UpdateButton(Action post) { if (!await post()) ErrorBox.Text = “Error posting message.”; } private void PostToTwitter() { UpdateButton(async () => await new TwitterAction().Post(“Hello, world!”)); } private void PostToFacebook() { UpdateButton(async () => await new FacebookAction().Post(“Hello, world!”)); } 不幸的是, !await post()不起作用,因为“Type’void’是不可行的。” 所以问题是,如何在此方法中定义我的参数以支持等待参数? 这是TwitterAction()。Post()的定义方式…… public virtual async Task Post(string messageId){…}