首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Func<param,带lambda的param>

Func<param,带lambda的param>
EN

Stack Overflow用户
提问于 2016-05-31 13:05:28
回答 2查看 72关注 0票数 0

尝试将lambda表达式与预定义的"Func“一起使用,而不是将其写入函数中:

代码语言:javascript
复制
var population = ...
if (!(PopulationsList.Any(pop => pop.Name == population.Name && pop != population)))

这是可行的。但我不希望在我的代码中出现lambdas (编辑并继续问题)

如果population.Name是一个常量,我会写一个这样的谓词:

代码语言:javascript
复制
Func<Population, bool> namePred = x => x.Name == constantName;

 if (!(PopulationsList.Any(namePred))

在我的例子中,我如何使用这样的语法?谢谢

EN

回答 2

Stack Overflow用户

发布于 2016-05-31 13:40:18

我认为问题在第一点还不够清楚。

委托只是一个指向编译器将为您生成的函数的指针。

我明白您在这里关于Constant的观点,因为您有一个local变量作为参数,Func<Population, bool>不仅指向它需要的普通method,还需要以某种方式存储local变量填充。

正常场景:

代码语言:javascript
复制
PopulationsList.Any(pop => pop.Name == "constantString")

等同于:

代码语言:javascript
复制
PopulationsList.Any(CompilerGeneratedFunction);

private bool CompilerGeneratedFunction(Population pop)
{
   return pop.Name == "constantString";
}

复杂场景:

(当您的lambda中包含对象时,编译器需要将此对象存储在函数可以访问它的某个位置)

代码语言:javascript
复制
input = population;
PopulationsList.Any(CompilerGeneratedFunction);

Population input = null;
private bool CompilerGeneratedFunction(Population pop)
{
   return pop => pop.Name == input .Name && pop != input;
}

您不能将另一个参数传递给CompilerGeneratedFunction,因为委托签名为Func<Population, bool>,所以该方法应该只接受population对象并返回boolean

这不完全是编译器所做的,编译器可能会创建一个类来存储对象,但这只是一种变通方法。

票数 0
EN

Stack Overflow用户

发布于 2016-05-31 14:00:23

好的-明白了。通过迭代谓词函数,我可以在population类中的每个IEnumerable实例中配置以下函数:

代码语言:javascript
复制
 public class population
{public bool isDuplicateKey(Population pop)
    {
        return pop.Name == this.Name && pop != this;
    }
 }

用法:

代码语言:javascript
复制
 if (!(PopulationsList.Any(population.isDuplicateKey)))

感谢所有人的帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37537212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档