Tag: lambda

Lambda的显式返回types

当我尝试编译这个代码(VS2010)时,我得到以下错误: error C3499: a lambda that has been specified to have a void return type cannot return a value void DataFile::removeComments() { string::const_iterator start, end; boost::regex expression("^\\s?#"); boost::match_results<std::string::const_iterator> what; boost::match_flag_type flags = boost::match_default; // Look for lines that either start with a hash (#) // or have nothing but white-space preceeding the hash symbol remove_if(rawLines.begin(), […]

只有在Java8中使用lambda不为null的情况下才会过滤值

我有一个对象列表说car 。 我想根据使用Java 8的一些参数来过滤这个列表。但是如果参数为null ,则会抛出NullPointerException 。 如何过滤出空值? 目前的代码如下 requiredCars = cars.stream().filter(c -> c.getName().startsWith("M")); 如果getName()返回null则抛出NullPointerException 。

为什么在lambdaexpression式中使用迭代variables是不好的

我只是写了一些简单的代码,并注意到这个编译器错误 在lambdaexpression式中使用迭代variables可能会有意想不到的结果。 相反,在循环中创build一个局部variables并为其分配迭代variables的值。 我知道这意味着什么,我可以很容易地解决这个问题,而不是一个大问题。 但我想知道为什么在lambda中使用迭代variables是一个坏主意? 我以后可能会造成什么问题?

Java8stream顺序和并行执行产生不同的结果?

在Java8中运行以下stream示例: System.out.println(Stream .of("a", "b", "c", "d", "e", "f") .reduce("", (s1, s2) -> s1 + "/" + s2) ); 收益率: /a/b/c/d/e/f 当然,这并不奇怪。 由于http://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.htmlstream是顺序执行还是并行执行都无关紧要: 除了标识为明确不确定的操作(如findAny())之外,顺序执行还是并行执行都不应改变计算结果。 AFAIK reduce()是确定性的,并且(s1, s2) -> s1 + "/" + s2是关联的,所以添加parallel()应该产生相同的结果: System.out.println(Stream .of("a", "b", "c", "d", "e", "f") .parallel() .reduce("", (s1, s2) -> s1 + "/" + s2) ); 但是我的机器上的结果是: /a//b//c//d//e//f 这里有什么问题? 顺便说一句:使用(首选的) .collect(Collectors.joining("/"))而不是reduce(…)产生相同的结果a/b/c/d/e/f […]

“System.Int32”types的expression式不能用于返回types“System.Object”

我正在尝试制作一个简单的脚本系统,用于打印标签。 我已经在过去做了这个没有问题的反思,但我现在正在尝试使用Lambda函数来执行此操作,以便可以caching函数以供重用。 我到目前为止的代码如下… public static string GetValue<T>(T source, string propertyPath) { try { Func<T, Object> func; Type type = typeof(T); ParameterExpression parameterExpression = Expression.Parameter(type, @"source"); Expression expression = parameterExpression; foreach (string property in propertyPath.Split('.')) { PropertyInfo propertyInfo = type.GetProperty(property); expression = Expression.Property(expression, propertyInfo); type = propertyInfo.PropertyType; } func = Expression.Lambda<Func<T, Object>>(expression, parameterExpression).Compile(); object value = […]

如何简化重复如果然后分配build设?

我有以下的方法: protected override bool ModifyExistingEntity(Product entity, ProductModel item) { bool isModified = false; if (entity.Title != item.Title) { isModified = true; entity.Title = item.Title; } if (entity.ServerId != item.Id) { isModified = true; entity.ServerId = item.Id; } return isModified; } 我想知道你是否可以提出一个更好的方法来实现这个方法。 问题是显而易见的:每个属性的5行几乎复制粘贴的代码太多了。 可能有一个解决scheme使用Func -s / Expression -s超出了我的视野。

将谓词的expression式树变为另一种types

介绍 在我正在开发的应用程序中,每个业务对象有两种:“ActiveRecord”类和“DataContract”类。 所以例如,会有: namespace ActiveRecord { class Widget { public int Id { get; set; } } } namespace DataContract { class Widget { public int Id { get; set; } } } 数据库访问层负责在系列之间进行转换:可以告诉它更新一个DataContract.Widget ,它会奇迹般地创build一个具有相同属性值的ActiveRecord.Widget ,并保存它。 尝试重构此数据库访问层时,问题浮出水面。 问题 我想添加如下的方法到数据库访问层: // Widget is DataContract.Widget interface IDbAccessLayer { IEnumerable<Widget> GetMany(Expression<Func<Widget, bool>> predicate); } 以上是一个简单的通用的自定义谓词的“get”方法。 唯一感兴趣的是我传递一个expression式树而不是一个lambda,因为在IDbAccessLayer我正在查询一个IQueryable<ActiveRecord.Widget> ; 有效地做到这一点(认为LINQ到SQL)我需要传递一个expression式树,所以这个方法要求这样做。 […]

什么是深入学习C#expression式树的最佳资源?

当我第一次input这个问题的时候,我是这样做的,为了find重复的问题,确信有人肯定已经问过这个问题。 我的计划是遵循这些欺骗链接,而不是张贴这个问题。 但是,就我所见,这个问题还没有被问到……它在“相关问题”列表中没有出现。 为了深入理解C#中的expression式树,您发现了哪些最好的资源(文章,书籍,博文等)? 我一直对自己的能力感到惊讶,而现在我正要说的是:“好吧,足够的惊喜,我现在要停下来,拿到这些东西的博士学位。 我正在寻找系统地,有条不紊地涵盖这些function的材料,然后详细介绍可以用它们做什么的详细示例。 注意:我不是在谈论lambdaexpression式。 我正在谈论expression<T>和所有与之相关的事物,并从中产生。 谢谢。

这个lambda / yield / generator理解是如何工作的?

我今天正在查看我的代码库,发现这个: def optionsToArgs(options, separator='='): kvs = [ ( "%(option)s%(separator)s%(value)s" % {'option' : str(k), 'separator' : separator, 'value' : str(v)} ) for k, v in options.items() ] return list( reversed( list( (lambda l, t: (lambda f: (f((yield x)) for x in l) )(lambda _: t) )(kvs, '-o') ) ) ) 它似乎需要一个参数的字典,并把它们变成一个shell命令的参数列表。 它看起来像是在一个生成器理解中使用yield,我认为这是不可能的。 >>> optionsToArgs({"x":1,"y":2,"z":3}) ['-o', 'z=3', […]

如何将expression式<Func <T,DateTime >>转换为expression式<Func <T,object >>

我一直在寻找,但我无法find如何从types投下 Expression<Func<T, DateTime>> 到types: Expression<Func<T, object>> 所以我必须再次转向这个广阔的知识;)