Tag: lambda

Linq Lambda与查询语法性能

我今天在我的项目中看到了一个linq查询语法,它以这种方式从特定条件的List项中计算: int temp = (from A in pTasks where A.StatusID == (int)BusinessRule.TaskStatus.Pending select A).ToList().Count(); 我想通过写它来重构它就像使用Count()来使更多的可读性和我认为它将是性能明智也好,所以我写道: int UnassignedCount = pTasks.Count(x => x.StatusID == (int)BusinessRule.TaskStatus.Pending); 但是当我通过StopWatch进行检查时,lambda表达式所经历的时间总是超过查询synax: Stopwatch s = new Stopwatch(); s.Start(); int UnassignedCount = pTasks.Count(x => x.StatusID == (int)BusinessRule.TaskStatus.Pending); s.Stop(); Stopwatch s2 = new Stopwatch(); s2.Start(); int temp = (from A in pTasks where A.StatusID == […]

lambda表达式如何在内部工作?

在查找这个问题的答案时:“ 为什么在匿名方法中不允许使用out参数? ”我对lambda表达式和匿名方法实际如何工作有点遗憾。 在评论中,JaredPar声称“想象一下,例如out参数引用堆栈上的局部变量.lambda可以在将来的任意点执行,因此可以在堆栈帧不再有效时执行”。 我指出,如果不是任何其他变量的情况……这基本上让我想知道我对lambda表达式的真正了解。 我想到的是这样的事情: public void Foo(ComplexObject val, out SomeDelegate outDelegate) { ComplexObject obj = new ComplexObject(val) SomeDelegate = delegate(int other) { return (obj.value * other); } } public void Bar() { SomeDelegate MyDel = null; Foo(5, out MyDel); int finalRes = MyDel(100); // Whatever } 在那种情况下,我真的不知道发生了什么。 obj是堆栈上的引用,它在方法返回时不再有效,因此匿名方法应该能够(如果可行)实际知道它是引用类型并复制引用而不是值,如果它…如果“用例”或多或少相同,为什么不参考params工作呢?

如何根据多个条件并使用linq从通用列表中删除项目

我有两个列表,一个包含URL,另一个包含所有MIME文件扩展名。 我想从第一个列表中删除所有指向此类文件的URL。 示例代码: List urls = new List(); urls.Add(“http://stackoverflow.com/questions/ask”); urls.Add(“http://stackoverflow.com/questions/dir/some.pdf”); urls.Add(“http://stackoverflow.com/questions/dir/some.doc”); //total items in the second list are 190 List mime = new List(); mime.Add(“.pdf”); mime.Add(“.doc”); mime.Add(“.dms”); mime.Add(“.dll”); 删除多个项目的一种方法是: List result = urls.Where(x => (!x.EndsWith(“.pdf”)) && (!x.EndsWith(“.doc”)) && (!x.EndsWith(“.dll”))).ToList(); 但是,我的第二个列表中有超过190个扩展。 问题 – 我可以使用单行删除第一个列表中的项目,还是仅使用foreach循环?

使用Func委托与Async方法

我试图使用Func与异步方法。 我收到了一个错误。 无法将异步lambda表达式转换为委托类型’Func’ 。 异步lambda表达式可能返回void,Task或Task ,其中任何一个都不能转换为’Func’ 。 以下是我的代码: public async Task CallAsyncMethod() { Console.WriteLine(“Calling Youtube”); HttpClient client = new HttpClient(); var response = await client.GetAsync(“https://www.youtube.com/watch?v=_OBlgSz8sSM”); Console.WriteLine(“Got Response from youtube”); return response; } static void Main(string[] args) { Program p = new Program(); Task myTask = p.CallAsyncMethod(); Func myFun =async () => await myTask; Console.ReadLine(); }

Lambda表达式:== vs. .Equals()

这是一个纯粹的学术问题,但在lambda表达式中使用==和.Equals以及首选哪一个有什么区别? 代码示例: int categoryId = -1; listOfCategories.FindAll(o => o.CategoryId == categoryId); 要么 int categoryId = -1; listOfCategories.FindAll(o => o.CategoryId.Equals(categoryId));

如何将Func 隐式转换为Expression <Func >?

我不明白这里发生了什么: 这两行都编译: Func func = () => new object(); Expression<Func> expression = ()=>new object(); 但这不是: expression = func; LambdaExpression或Expression没有将委托转换为Expression的隐式运算符,因此必须进行其他操作才能使赋值工作。 它是什么?

是否可以在EntityFramework中对SelectMany使用Select(l => new {})

我正在尝试一些我不太确定的事情,但我想在这里询问是否有可能。 能够做到吗? public IQueryable GetInfo(int count, byte languageId) { return db.Info.SelectMany(i => i.LanguageInfo) .Where(l => l.Language.id == languageId) .Select(l => new Info { AddDate = l.Info.AddDate, Description = l.Description, EntityKey = l.Info.EntityKey, id = l.Info.id, Title = l.Title, ViewCount = l.Info.ViewCount } ) .OrderByDescending(i => i.id) .Take(count); } 执行此方法时出现错误 无法在LINQ to Entities查询中构造实体或复杂类型“GuideModel.Info”。 这是否意味着“不可能”? 谢谢

如何转换表达式树?

更新 : 我会试着解释一下我的意思。 有2个不同的类(MyClass1和MyClass2)以及将class1转换为class2的方法: class MyClass1 { //…Some fields and properties } class MyClass2 { //…Some fields and properties } public MyClass2 Convert(MyClass1 class1) { //….. return class2Object; } 有两种不同的方法: void method1(Expression<Func> where, //other parameters) { //some operations //…………… //need to call method2(Expression<Func>) // BUT! How do I convert Expression<Func> // to Expression<Func> } void […]

比较两个以逗号分隔的字符串匹配的最短代码是什么?

以下称为UserCanAccessThisPage的方法基于以下逻辑:每个用户和每个页面都有一个组列表。 如果其中任何一个匹配,则用户可以访问该页面。 下面的代码做了我想要的,但我的解决方案是C#1 (或C#2,至少我没有使用ArrayList)。 任何人都可以重构这一点,这样更简单,例如使用lambdas来消除这两种方法吗? 我只是无法获得语法来做到这一点。 using System; using System.Collections.Generic; using System.Linq; namespace TestCompare2343 { class Program { static void Main(string[] args) { string anonymousUserAccessGroups = “loggedOutUsers”; string normalUserAccessGroups = “loggedInUsers, members”; string developerUserAccessGroups = “loggedInUsers, members, administrators, developers”; string loginPageAccessGroups = “loggedOutUsers”; string logoutPageAccessGroups = “loggedInUsers”; string memberInfoPageAccessGroups = “members”; string devPageAccessGroups = “developers”; […]

如何创建具有表达式作为参数的通用表达式

ASP.Net MVC中有一个DisplayNameFor(x=>x.Title)帮助器。 我想在行为中实现类似的东西。 我想有一个方法接受基于User类( u=>u.Birthdate或u => u.Name)的表达式,一个操作数(Greater,Less,Equal)和一个像DateTime.Now这样的值并返回一个表达式u=>u.Birthdate > DateTime.Now 我知道我必须手工构建结果表达式。 我无法包裹的是传递和处理属性表达。 编辑: 我想调用一个类似的方法 GetFilterPredicate(u=>u.Birthdate,FilterOps.GreaterThan,DateTime.Parse(“01.01.2013”)或 GetFilterPredicate(u=>u.SomeIntProperty,FilterOps.Equals,2) 更新:我创建了一个包含此问题解决方案的repo以及一个集合属性过滤https://github.com/Alexander-Taran/Lambda-Magic-Filters