Func <param,param> with lambda

时间:2016-05-31 05:05:28

标签: c# syntax lambda

尝试使用带有预定义&#34; Func&#34;的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))

如果有的话,我可以在我的案例中使用这样的语法。 感谢

2 个答案:

答案 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)))

感谢您的帮助