Tag: lambda

C#,Linq2Sql:是否可以将两个可查询连接成一个?

我有一个可查询的地方,我使用各种Where和WhereBetween语句将集合缩小到某个集合。 现在我需要添加一个Where || WhereBetween Where || WhereBetween 。 换句话说,我不能像现在一样把它们连在一起,因为它可以作为一个And。 那么,我该怎么做呢? 我看到两种可能性: 从我拥有的一个查询中创建两个查询 ,一个使用Where ,一个使用WhereBetween 。 然后将它们连接起来 。 不知道这是否可能? 此外,虽然不是在我的特定情况下,你很可能最终会重复… 以某种方式合并Where表达式和WhereBetween创建的表达式 。 首先,如上所述,我不确定是否可能。 如果是的话,我不太确定这是一个很好的方法。 第二,我可以看到一个选项,但不完全确定所有的细节。 下面是我的另一个问题中的WhereBetween方法,我现在使用它并且效果很好: public static IQueryable WhereBetween( this IQueryable source, Expression<Func> selector, IEnumerable<Range> ranges) { var param = Expression.Parameter(typeof(TSource), “x”); var member = Expression.Invoke(selector, param); Expression body = null; foreach (var range in […]

如何从字符串为深属性创建表达式树/ lambda

给定一个字符串:“Person.Address.Postcode”我希望能够在Person的实例上获取/设置此postcode属性。 我怎样才能做到这一点? 我的想法是将字符串拆分为“。” 然后迭代这些部分,寻找前一个类型的属性,然后构建一个看起来像(伪语法道歉)的表达式树: (person => person.Address) address => address.Postcode 我在实际创建表达式树时遇到了麻烦! 如果这是最好的方式,有人可以建议如何去做,还是有更简单的选择? 谢谢 安德鲁 public class Person { public int Age { get; set; } public string Name { get; set; } public Address Address{ get; set; } public Person() { Address = new Address(); } } public class Address { public string Postcode { […]

我可以使用lambda语法忽略委托参数吗?

我很好奇为什么C#允许我在某些情况下忽略委托参数而不是其他情况。 例如,这是允许的: Action action = delegate { Console.WriteLine(“delegate”); }; 但这不是: Action action = () => Console.WriteLine(“lambda”); 有没有办法初始化委托并使用lambda忽略参数? 我知道我可以向lambda添加一个参数并修复前一行,但这更像是一个与编译器有关的学术问题,以及为什么或如何工作。

如何从()=> foo.Title表达式获取对象实例

我有一个带有属性的简单类 class Foo { string Title { get; set; } } 我试图通过调用函数来简化数据绑定 BindToText(titleTextBox, ()=>foo.Title ); 这被宣布为 void BindToText(Control control, Expression<Func> property) { var mex = property.Body as MemberExpression; string name = mex.Member.Name; control.DataBindings.Add(“Text”, ??? , name); } 那我该怎么办??? 对于我的Foo类的实例。 如何从lambda表达式中获取对调用foo实例的引用? 编辑:实例应该在某处,因为我可以调用property.Compile()并创建一个在我的BindToText函数中使用foo实例的委托。 所以我的问题是,如果可以在不添加函数参数中实例的引用的情况下完成此操作。 我呼吁Occum的Razor提供最简单的解决方案。 编辑2:许多人没有注意到的是在我的函数中访问foo实例时存在的闭包 ,如果我编译lambda。 为什么编译器知道在哪里找到实例,我不知道? 我坚持认为必须有一个答案, 而不必通过额外的论证。 解 感谢VirtualBlackFox的解决方案是这样的: void BindText(TextBoxBase text, Expression<Func> property) […]

值在枚举列表中

我有一个相当基本的问题:如何检查给定值是否包含在枚举值列表中? 例如,我有这个枚举: public enum UserStatus { Unverified, Active, Removed, Suspended, Banned } 现在我想检查status in (Unverified, Active) 我知道这有效: bool ok = status == UserStatus.Unverified || status == UserStatus.Active; 但必须有一种更优雅的方式来写这个。 这个queston的主题非常相似,但那是处理标志枚举,这不是标志枚举。 提前致谢。

如何分解成员访问表达式链?

短版(TL; DR): 假设我有一个表达式,它只是一个成员访问运算符链: Expression<Func> e = x => x.foo.bar.baz; 您可以将此表达式视为子表达式的组合,每个子表达式包含一个成员访问操作: Expression<Func> e1 = (Tx x) => x.foo; Expression<Func> e2 = (Tfoo foo) => foo.bar; Expression<Func> e3 = (Tbar bar) => bar.baz; 我想要做的是将这些组件子表达式分解,以便我可以单独使用它们。 更短的版本: 如果我有表达式x => x.foo.bar ,我已经知道如何中断x => x.foo 。 如何拉出另一个子表达式foo => foo.bar ? 为什么我这样做: 我试图在C#中模拟“提升”成员访问操作符,就像CoffeeScript的存在访问操作符一样?. 。 Eric Lippert表示, 类似的运营商被考虑用于C#,但没有预算来实施它。 如果这样的运算符存在于C#中,您可以执行以下操作: value = target?.foo?.bar?.baz; 如果target.foo.bar.baz链的任何部分结果为null,那么整个事情将评估为null,从而避免NullReferenceException。 […]

如何为Like创建System.Linq.Expressions.Expression?

我从这个源创建了一个可过滤的BindingList。 它很棒: list.Filter(“Customer == ‘Name'”); 应该做什么。 内部!=像解析器一样工作,将表达式==或!=转换为System.Linq.Expressions.Expression 。 在这种情况下, ==成为System.Linq.Expressions.Expression.Equal 。 不幸的是System.Linq.Expressions.Expression不包含like运算符,我不知道如何解决这个问题。 初始代码如下所示: private static Dictionary<String, Func> binaryOpFactory = new Dictionary<String, Func>(); static Init() { binaryOpFactory.Add(“==”, Expression.Equal); binaryOpFactory.Add(“>”, Expression.GreaterThan); binaryOpFactory.Add(“=”, Expression.GreaterThanOrEqual); binaryOpFactory.Add(“<=", Expression.LessThanOrEqual); binaryOpFactory.Add("!=", Expression.NotEqual); binaryOpFactory.Add("&&", Expression.And); binaryOpFactory.Add("||", Expression.Or); } 然后我创建了一个能够做我想要的表达式: private static System.Linq.Expressions.Expression<Func> Like_Lambda = (item, search) => item.ToLower().Contains(search.ToLower()); private static Func Like = […]

从Lambda Property Expression获取自定义属性

我正在使用ASP.NET MVC 2 Preview 2并编写了一个自定义的HtmlHelper扩展方法来使用表达式创建标签。 TModel来自具有属性的简单类,属性可以具有定义validation要求的属性。 我试图找出表达式在我的label方法中表示的属性上是否存在某个属性。 类和标签的代码是: public class MyViewModel { [Required] public string MyProperty { get; set; } } public static MvcHtmlString Label(this HtmlHelper htmlHelper, Expression<Func> expression, string label) { return MvcHtmlString.Create(string.Concat(“”, label, “”)); } public static string GetInputName(this Expression<Func> expression) { return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1); } 然后我会像这样称呼标签: Html.Label(x => x.MyProperty, “My Label”) […]

表达式的反转<Func >。编译()?

既然我们可以: Expression<Func> predicate = x => x > 5; var result = Enumerable.Range(0,10).Where(predicate.Compile()); 我怎么能够: Func predicate = x => x > 5; Expression<Func> exp = predicate.Decompile(); 也就是说,我想得到相应的Func Expression 。 可能吗?

for循环和带闭包的foreach循环的不同行为

我无法解释我遇到的问题。 基本上,如果我在foreach循环中使用lambda语法,那么我会得到一个不同的答案,而不是在for循环中使用它。 在下面的代码中,我在“调度程序”类中注册一个委托。 然后我在另一个委托中将委托包装出来并返回这些包装委托的列表。 然后我执行它们。 执行包装函数列表的预期输出为1,2。 但是当我组合lambda和foreach循环时,我没有看到。 这不是引起问题的代码,而是我可以用来重现它的最简单的情况。 我不想讨论这个用例,我更好奇为什么我得到的行为我没想到。 如果我使用lambda语法使用下面的foreach循环,它将失败。 如果我使用新的Action()语法和foreach它可以工作,如果我在for循环中使用lambda语法,它就可以工作。 任何人都可以解释这里发生了什么。 这让我很难过。 public class Holder { public Holder(int ID, Dispatcher disp) { this.ID = ID; disp.Register(Something); } public int ID { get; set; } private void Something(int test) { Console.WriteLine(ID.ToString()); } } public class Dispatcher { List<Action> m_Holder = new List<Action>(); public void Register(Action […]