Tag: lambda

如何在LINQ语句中重用表达式?

我喜欢为DRY原因重用表达式,但是如何在LINQ语句中重用表达式? 例如 我有 public static class MyExpressions { public static Expression<Func> IsAGoodProduct() { return (p) => p.Quality>3; } } 并且想在LINQ语句中使用它,所以 var goodProds = from p in dataContext.Products where ????? // how do I use IsAGoodProduct here? select p; 当然,我可以使用IQueryableExtension.Where函数,但这会使联接和其他函数对于更复杂的查询更加困难。 这是可能的还是LINQ的限制?

C#风格:Lambdas,_ =>或x =>?

在C#中使用lambda表达式之前我已经习惯了使用lambda表达式,因此我养成了以Func,forms使用_作简单lambda的习惯Func,特别是对于简单的lambdas,其中body只是一个表达式表示返回值(谓词等)。 但是,在C#中,我常常看到单个字母而不是_用于这些相同类型的lambda表达式,例如x,y,z,i,j,k 。 字母方法对我来说似乎很奇怪,因为这些字母在循环变量中已经具有常用的另一种典型含义。 在我看来, _通常更容易阅读。 单字母风格真的是C#中lambdas的既定风格吗? 例子: 我以前写的东西: var ages = people.Select(_ => _.Age); 我所看到的是写作: var ages = people.Select(x => x.Age); // choice of ‘x’ is not consistent

搜索分层列表

我有一个简单的类定义为: public class IndexEntry { public bool HighScore { get; set; } public List SubEntries { get; set; } //Other properties, etc… } 我现在需要搜索List以找到其HighScore属性设置为true的一个项目。 因为它不是一个平面列表,而是一个层次结构,它可能是一个未知数量级别的深度,因为我正在寻找的项目可能包含在任何一个SubEnties列表中,我不能做一个简单的Lambda像这个: var foundHighScore = myList.FirstOrDefault(IE => IE.HighScore == true); 这是我的代码。 我知道这很难看(至少对我而言似乎这样)。 它有效,但在一个甚至远程大型列表上的速度很慢,我确信必须有更好的方法。 private IndexEntry GetHighScoreEntry(IEnumerable entryList) { IndexEntry result = null; IndexEntry recursiveResult = null; foreach (IndexEntry currentEntry in entryList) { […]

使用Lambda表达式获取方法名称

我试图使用lambda表达式获取类型的方法名称。 我正在使用Windows Identity Foundation,需要定义具有类型名称的访问策略,其中命名空间作为资源,方法名称作为操作。 这是一个例子。 这是我将从以下类型获取类型名称和方法名称的类型: namespace My.OrderEntry { public class Order { public void AddItem(string itemNumber, int quantity) {} } } 这就是我想通过DSL定义访问策略的方法: ForResource().Performing(o => o.AddItem).AllowUsersHaving(new Claim()); 从该声明中,我想将“My.OrderEntry.Order”作为资源,将“AddItem”作为动作。 获取带有命名空间的类型名称是没有问题的,但我认为我不能将lambda用于我正在尝试的方法。 public static IPermissionExp Performing( this IActionExp exp, Func action) {} //this is where I don’t know what to define 这种事情甚至可能吗? 是否有另一种方法可以在不使用魔术字符串的情况下完成此类操作?

通过指定多个条件在通用列表中查找项目

通常我们会找到包含以下代码的通用列表: CartItem Item = Items.Find(c => c.ProductID == ProductID); Item.Quantity = Quantity; Item.Price = Price; 所以上面的代码找到并更新了其他数据,但如果我想通过多个条件找到,那么我该如何编写代码呢? 我想写代码如下: CartItem Item = Items.Find(c => c.ProductID == ProductID and c.ProductName == “ABS001”); 当我们找到通用列表时,请引导我了解多种情况。

从字符串创建lambda表达式

可能重复: 有一种简单的方法可以将(lambda表达式)字符串解析为Action委托吗? 我想将lambda表达式存储为配置文件中的字符串,并在运行时将这些字符串动态加载到C#中的lambda表达式中。 我的目标是配置和注入规则。 任何可用于从字符串创建lambda表达式的实用程序? 对于同一目标,还有其他轻量级解决方案吗?

使用Dyanmic字段名称使用LINQ查询实体

我在ASP.NET MVC中创建了一个动态搜索屏幕。 我通过reflection从实体中检索了字段名称,这样我就可以允许用户选择要搜索的字段而不是显示视图中的所有字段。 当搜索结果回发到控制器时,我收到一个包含FieldName和Value的FormCollection。 我不知道搜索了多少字段,FormCollection只包含用户选择的字段。 我希望能够现在获取该字段名称,并在我查询数据库时将其应用于我的LINQ语句,例如: public List SearchPeople(Dictionary fieldValueDictionary) { List searchResults = new List(); foreach (string key in fieldValueDictionary.Keys) { searchResults.Add(entities.People.Where(p => p. == fieldValueDictionary[key])); } return searchResults; } 我在“使用键字符串作为fieldName”的地方就像p => p.FirstName == fieldValueDictionary [key]其中key =“FirstName”。 我尝试过但未能使用Lambda表树,并且在动态LINQ方面取得了一些成功。 唯一的另一种选择是做类似的事情: public List SearchPeople(Dictionary fieldValueDictionary) { IQueryable results = entities.People; foreach (string key in fieldValueDictionary.Keys) { […]

如何在没有调用的情况下合并两个C#Lambda表达式?

我想合并以下表达式: // example class class Order { List Lines } class OrderLine { } Expression<Func<Order, List>> selectOrderLines = o => o.Lines; Expression<Func<List, Boolean>> validateOrderLines = lines => lines.Count > 0; // now combine those to Expression<Func> validateOrder; 我使用selectOrderLines上的调用并将结果提供给validateOrderLines,但是因为我在Entity Framework中使用这些表达式,我必须实际创建一个干净的表达式,它应该代表: Expression<Func> validateOrder = o => o.Lines.Count > 0; 我怎样才能做到这一点?

C#如何将Expression <Func >转换为Expression <Func >

我之前使用过基于lamdas的C#表达式,但我没有手工编写它们的经验。 给定一个Expression<Func> originalPredicate ,我想创建一个Expression<Func> translatedPredicate 。 在这种情况下,SomeType和OtherType具有相同的字段,但它们不相关(没有inheritance而不是基于公共接口)。 背景:我有一个基于LINQ to SQL的存储库实现。 我将LINQ to SQL实体投影到我的Model实体,以便将我的模型保存在POCO中。 我想将表达式传递给存储库(作为规范的一种forms),但它们应该基于模型实体。 但我无法将这些表达式传递给数据上下文,因为它需要基于LINQ to SQL实体的表达式。

创建动态谓词 – 将属性作为参数传递给函数

我正在尝试创建动态谓词,以便它可以用于过滤列表 public class Feature { public string Color{get;set;} public string Weight{get;set;} } 我希望能够创建一个动态谓词,以便可以过滤List。 我得到一些条件,因为字符串值“>”,“ =”等。我有办法做到这一点吗? public Predicate GetFilter(X property,T value, string condition) //no clue what X will be { switch(condition) { case “>=”: return new Predicate(property >= value)//or something similar } } 用法可能是: var filterConditions=GetFilter(x=>x.Weight,100,”>=”); 如何定义GetFilter? 以及如何在其中创建谓词?