尝试将lambda表达式与预定义的"Func“一起使用,而不是将其写入函数中:
var population = ...
if (!(PopulationsList.Any(pop => pop.Name == population.Name && pop != population)))这是可行的。但我不希望在我的代码中出现lambdas (编辑并继续问题)
如果population.Name是一个常量,我会写一个这样的谓词:
Func<Population, bool> namePred = x => x.Name == constantName;
if (!(PopulationsList.Any(namePred))在我的例子中,我如何使用这样的语法?谢谢
发布于 2016-05-31 13:40:18
我认为问题在第一点还不够清楚。
委托只是一个指向编译器将为您生成的函数的指针。
我明白您在这里关于Constant的观点,因为您有一个local变量作为参数,Func<Population, bool>不仅指向它需要的普通method,还需要以某种方式存储local变量填充。
正常场景:
PopulationsList.Any(pop => pop.Name == "constantString")等同于:
PopulationsList.Any(CompilerGeneratedFunction);
private bool CompilerGeneratedFunction(Population pop)
{
return pop.Name == "constantString";
}复杂场景:
(当您的lambda中包含对象时,编译器需要将此对象存储在函数可以访问它的某个位置)
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。
这不完全是编译器所做的,编译器可能会创建一个类来存储对象,但这只是一种变通方法。
发布于 2016-05-31 14:00:23
好的-明白了。通过迭代谓词函数,我可以在population类中的每个IEnumerable实例中配置以下函数:
public class population
{public bool isDuplicateKey(Population pop)
{
return pop.Name == this.Name && pop != this;
}
}用法:
if (!(PopulationsList.Any(population.isDuplicateKey)))感谢所有人的帮助
https://stackoverflow.com/questions/37537212
复制相似问题