尝试使用带有预定义" Func"的lambda表达式而不是在函数内写入:
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))
如果有的话,我可以在我的案例中使用这样的语法。 感谢
答案 0 :(得分:0)
我认为第一点上的问题不够明确。
委托只是指向编译器将为您生成的函数的指针。
我在这里看到你的Constant
点,因为你有一个local
变量作为参数,Func<Population, bool>
不仅指向一个正常的method
,它还需要以某种方式存储local
变量种群。
正常情景:
PopulationsList.Any(pop => pop.Name == "constantString")
Is Equivelant:
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
。
这不完全是编译器所做的,编译器可能会创建一个类来存储对象,但它只是一种解决方法。
答案 1 :(得分:0)
好的 - 明白了。 设想itterating谓词函数foreen IEnumerable的实例我可以在population类中配置以下函数:
public class population
{public bool isDuplicateKey(Population pop)
{
return pop.Name == this.Name && pop != this;
}
}
用法:
if (!(PopulationsList.Any(population.isDuplicateKey)))
感谢您的帮助