Tag: lambda

在运行时动态创建函数

它可能甚至不可能这样做,但无论如何我会问。 是否有可能创建一个接收字符串的函数,然后将其用作lambda中使用的转到运算符(=>)的右侧参数? 实际上,我想要做的是能够在运行时重新定义特定类的特定方法。 我想在程序运行时写下一个函数并将其附加到委托。 可能吗?

在基础构造函数中使用lambdas表达式的例子

在我们构建的框架中,我们需要以下模式: public class BaseRenderer { Func renderer; public BaseRenderer(Func renderer) { this.renderer = renderer; } public string Render() { return renderer(); } } public class NameRenderer : BaseRenderer { public string Name{ get; set; } public NameRenderer () : base(() =>this.Name) {} } 如您所见,我们在调用基础构造函数时创建了一个lambda。 public class Program { public static void Main() { Console.WriteLine(new NameRenderer(){Name […]

.NET – 将语句lambda body转换为字符串

给出以下语句lambda示例: var fMyAction = new Action(() => { x += 2; something = what + ever; }); 有什么方法可以获得lambda的主体并将其转换为字符串? (最终将允许为此类的Action类编写扩展方法的东西: fMyAction.Dump()将返回”x += 2; something = what + ever;” )。 谢谢

C#List .RemoveAll() – 如何删除列表的子集?

我有2个类feed_Auto和具有多个匹配属性的Product 。 对于此特定问题,AutoID是我需要使用的唯一字段。 我有一个List ,有几百个唯一条目。 我有一个小的List有10个,20个唯一条目。 我现在想要从大列表中删除小列表中的所有项目。 如何使用RemoveAll({lambda expression})来完成此任务? 我发现的所有示例都取决于通用列表是简单类型(字符串,整数等)。 private static int DoInserts(ref List source, ref List target, Guid companyID) { List newProductList = new List(); List dropSourceList = new List(); using (var db = Helpers.GetProdDB()) { foreach (var src in source) { var tgt = target.Where(a => a.alternateProductID == src.AutoID && a.LastFeedUpdate 0) […]

LINQ / Lambda相当于SQL中的

我有一个IEnumerable,它有一个带有id的对象列表。 我想选择ID为1,2,7,8,9,10和11的那些对象。我不知道等效SQL语句的LINQ / Lambda等价物(选择*其中id为(1,2), 7,8,9,10,11))。 我试过类似的东西: var movieratings = new int[] {1, 2, 7, 8, 9, 10, 11}; list.ratings= list.ratings.Select(x => movieratings.Contains(x.Value)); 但这给了我一个编译错误,比如说无法从使用中推断出类型参数。

LINQ表达式中不区分大小写的字符串比较

我正在尝试编写一个ExpressionVisitor来包装我的LINQ到对象表达式,以自动使它们的字符串比较不区分大小写,就像它们在LINQ-to-entities中一样。 编辑:我确实想要使用ExpressionVisitor,而不是仅仅在创建它时为我的表达式应用一些自定义扩展或其他一些重要原因:传递给我的ExpressionVisitor的表达式是由ASP.Net Web API ODATA层生成的,所以我无法控制它是如何生成的(即我不能小写它正在搜索的字符串,除非在此ExpressionVisitor中)。 必须支持LINQ to Entities。 不只是扩展。 这是我到目前为止所拥有的。 它在字符串上查找对“Contains”的调用,然后在该表达式内的任何成员访问上调用ToLower。 但是,它不起作用。 如果我在更改后查看表达式,它看起来对我来说是正确的,所以我不确定我可能做错了什么。 public class CaseInsensitiveExpressionVisitor : ExpressionVisitor { protected override Expression VisitMember(MemberExpression node) { if (insideContains) { if (node.Type == typeof (String)) { var methodInfo = typeof (String).GetMethod(“ToLower”, new Type[] {}); var expression = Expression.Call(node, methodInfo); return expression; } } return base.VisitMember(node); } private […]

如何将OrderBy表达式数组传递给方法?

我正在尝试增强我的存储库,因此它是负责订购的人。 我已经应用了这个问题的答案,就存储库而言,我很确定它已经完成了。 我遇到的问题是我不知道如何将数组传递给存储库中的方法。 编译器不停地向我大吼大叫代表们。 在上面的链接问题中,作者基本上是在做我想要的,所以它必须是可能的。 这是我的存储库代码: public virtual IList SelectOrderedList( Expression<Func>[] Orderers, bool Ascending = true) { IOrderedQueryable TemporaryQueryable = null; foreach (Expression<Func> Orderer in Orderers) { if (TemporaryQueryable == null) { TemporaryQueryable = (Ascending ? this.ObjectSet.OrderBy(Orderer) : this.ObjectSet.OrderByDescending(Orderer)); } else { TemporaryQueryable = (Ascending ? TemporaryQueryable.ThenBy(Orderer) : TemporaryQueryable.ThenByDescending(Orderer)); }; }; return TemporaryQueryable.ToList(); } 另外,我并不是100%确定我应该使用Expression<Func> […]

从字符串的源列表动态生成最短正则表达式

我有一堆SKU(库存单位)代表一系列字符串,我想创建一个匹配的正则表达式。 所以,例如,如果我有SKU: var skus = new[] { “BATPAG003”, “BATTWLP03”, “BATTWLP04”, “BATTWSP04”, “SPIFATB01″ }; …我想自动生成正则表达式以识别任何一个SKU。 我知道我只能做”BATPAG003|BATTWLP03|BATTWLP04|BATTWSP04|SPIFATB01″ ,但SKU列表可能非常冗长,我想将生成的正则表达式压缩为”BAT(PAG003|TW(LP0(3|4)|SP04))|SPIFATB01” 所以这是一个组合运动。 我想生成所有可能的Regex以匹配我的任何输入字符串,并认为最短可能是最好的。 例如,我可以生产以下任何一种: BATPAG003|BATTWLP03|BATTWLP04|BATTWSP04|SPIFATB01 BAT(PAG003|TW(LP0(3|4)|SP04))|SPIFATB01 BAT(PAG003|TW(LP(03|04)|SP04))|SPIFATB01 B(ATPAG003|ATTW(LP0(3|4)|ATSP04))|SPIFATB01 任何这些都可行,但最短的可能就是我选择的那个。 首先,我尝试实现此function: Func<IEnumerable, IEnumerable> regexify = null; regexify = xs => from n in Enumerable.Range(1, 10) let g = xs.ToArray().Where(s => !String.IsNullOrWhiteSpace(s)).GroupBy(x => new String(x.Take(n).ToArray()), x => new String(x.Skip(n).ToArray())) let parts = […]

如何获取IQueryable.Count的ToTraceString

我使用((ObjectQuery)IQueryable).ToTraceString()来获取和调整将由LINQ执行的SQL代码。 我的问题是,与大多数IQueryable方法不同,IQueryable.Count定义如下: public static int Count(this IQueryable source) { return (int)source.Provider.Execute( Expression.Call( typeof(Queryable), “Count”, new Type[] { source.ElementType }, source.Expression)); } 执行查询而不编译并返回IQueryable。 我想通过这样的方式来做这个伎俩: public static IQueryable CountCompile(this IQueryable source) { return source.Provider.CreateQuery( Expression.Call( typeof(Queryable), “Count”, new Type[] { source.ElementType }, source.Expression)); } 但是然后CreateQuery给了我以下exception: LINQ to Entities query expressions can only be constructed from instances that […]

LINQ lambda表达式参数应该在第二个lambda中重用吗?

在这个问题之后,我想知道lambda参数表达式实例的重用是否应该被认为是好的还是坏的? 我有时会得到一个完整的LINQ表达式树,其中同一个lambda参数实例在第二个非生成的lambda中正确使用: // class Person { public int AProp { get; set; } public bool BProp { get; set; }} var lparam = Expression.Parameter(typeof(Person),”x”); var lambda1 = (Expression<Func>)Expression.Lambda(Expression.Property(lparam, “AProp”), lparam); var lambda2 = (Expression<Func>)Expression.Lambda(Expression.Property(lparam, “BProp”), lparam); var source = (new Person[0]).AsQueryable(); var query = source.Where(lambda2).OrderBy(lambda1); 因此,同一lambda参数实例lparam的声明对于lambda1和lambda2都是正确的。 只是这个共享的lambda参数实例强制IQueryProvider实现不基于纯lambda参数引用关联其他全局含义,因为在处理不同的lambda期间可能需要不同地解释相同的参数。 另外,你不会通过使用从LINQ获得这种表达式树(或者我应该说图形?) Expression<Func> lambda3 = x => x.AProp; Expression<Func> […]