草庐IT

三元表达

全部标签

c# - 如何将 'out' 参数传递给 lambda 表达式

我有一个具有以下签名的方法:privatePropertyInfogetPropertyForDBField(stringdbField,outstringprettyName)在其中,我根据给定的dbField找到关联值prettyName。然后我想找到名称为prettyName的所有属性(如果有的话),因此我尝试执行以下操作:IEnumerablematchingProperties=getLocalProperties().Where(prop=>prop.Name.Equals(prettyName));但是,这会产生以下错误:Cannotusereforoutparamete

c# - 如何将 if、else if 逻辑转换为三元运算符?

我只是想知道这是否可行,因为我开始使用三元运算符来减少代码行数并且我很喜欢它。if(x==y){z+=x;}elseif(x==z){z+=y;}else{z+=1;}如果只有一个这样的if语句,我现在可以这样做:z=x==y?z+=x:z+=1; 最佳答案 应该是这样的:z=x==y?z+x:x==z?z+y:z+1;如果您使用z+=x作为操作数,它最终会执行z=(z+=x)。虽然它在这种特殊情况下有效,但由于表达式z+=x的结果是z的最终值,它在其他情况下可能无效。但是,由于所有操作都有共同的z+=,您可以这样做:z+=x==y

c# - 对于匿名方法,是否存在委托(delegate)语法优于 lambda 表达式的情况?

随着lambda表达式(内联代码)等新功能的出现,是否意味着我们不必再使用委托(delegate)或匿名方法?在我看到的几乎所有示例中,它都是为了使用新语法进行重写。我们仍然必须使用委托(delegate)和lambda表达式的任何地方都行不通吗? 最佳答案 是的,有些地方直接使用匿名委托(delegate)和lambda表达式是行不通的。如果方法采用无类型委托(delegate),则编译器不知道将匿名委托(delegate)/lambda表达式解析为什么,您将收到编译器错误。publicstaticvoidInvoke(Deleg

c# - 如何替换 Regex 表达式中的实际星号字符 (*)?

我有一个声明:我有一个字符串,例如content="*test*"我想搜索并替换它,所以当我完成时,字符串包含以下内容:content="(*)test(*)"我的代码是:content=Regex.Replace(content,"*","(*)");但这会导致C#出错,因为它认为*是正则表达式语法的一部分。我如何修改此代码,以便将我的字符串中的所有星号更改为(*)而不会导致运行时错误? 最佳答案 由于*是正则表达式元字符,当您需要它作为字符类定义之外的文字星号时,需要使用\将其转义为\*。在C#中,您可以将其写为"\\*"或@"

c# - 将 LINQ 表达式传递给另一个 QueryProvider

我有一个简单的自定义QueryProvider,它接受一个表达式,将其转换为SQL并查询一个sql数据库。我想在QueryProvider中创建一个小的缓存来存储经常访问的对象,这样就可以在不命中数据库的情况下进行检索。QueryProvider有方法publicobjectExecute(System.Linq.Expressions.Expressionexpression){///BuildsanSQLstatementfromtheexpression,///executesitandreturnsmatchingobjects}缓存作为这个QueryProvider类中的一个

c# - 有没有一种简单的方法可以将(lambda 表达式)字符串解析为 Action 委托(delegate)?

我有一个方法可以根据传递给它的Action委托(delegate)来改变“帐户”对象:publicstaticvoidAlterAccount(stringAccountID,ActionAccountAction){AccountsomeAccount=accountRepository.GetAccount(AccountID);AccountAction.Invoke(someAccount);someAccount.Save();}这按预期工作...AlterAccount("Account1234",a=>a.Enabled=false);...但现在我想尝试做的是有一个像这

c# - 对 IEnumerable<T> 以外的类型(monads?)进行操作的 LINQ 查询表达式——可能的用途?

我正在看书Real-worldfunctionalprogrammingbyTomasPetricekandJonSkeet我很难消化关于计算表达式的部分1)(又名monad)。通过这本书,我了解到—与我以前的经验相反—LINQ查询表达式不限于IEnumerable,但也可以处理其他自定义类型。这对我来说似乎很有趣,我想知道是否存在查询表达式语法(fromxin...select...)非常适合的场景。一些背景信息:显然,此类自定义类型称为计算类型,它们被描述为与monadsinHaskell本质上相同的事物。.我一直无法理解monad到底是什么,但根据这本书,它们是通过称为bind和

c# - x64 平台上调试器中奇怪的三元运算符行为

我在我的C#代码中使用了一个非常简单的三元表达式:helperClass.SomeData=helperClass.HasData?GetSomeData():GetSomeOtherData();在这两种情况下,表达式的每个路径上的函数都返回一个非空对象,但如果我在调试器中查看结果,它是空的,直到我在代码中引用它,例如使用断言:Debug.Assert(helperClass.SomeData!=null);只有在Debug模式下使用“x64”或“任何CPU”平台设置时才会出现这种情况。在“x86”模式下没问题。在假设我在编译器或调试器中发现错误之前,我尽量保持谨慎,但我找不到对此行

c# - 编译 lambda 表达式会产生带有 Closure 参数的委托(delegate)

当我使用Expression.Lambda(...).Compile()时为了从表达式树创建委托(delegate),结果是第一个参数为Closure的委托(delegate).publicstaticFuncCreateTest(){ParameterExpressiona=Expression.Parameter(typeof(T));ParameterExpressionb=Expression.Parameter(typeof(T));Expressionaddition=Expression.Add(a,b);return(Func)Expression.Lambda(add

c# - 如何从表达式中获取子声明类型?

我有一个父/子类层次结构,其中父类抽象地声明了一个字符串属性,子类实现了它:abstractclassParent{publicabstractstringValue{get;}}classChild:Parent{publicoverridestringValue{get{returnnull;}}}当我使用显式(或隐式)使用Child类的表达式时,我希望表达式的MemberInfo的DeclaringType为“Child”,但实际上是Parent:Childchild=newChild();Expression>expression=(()=>child.Value);Membe