我倾向于delagate和lambda表达。我写了一些测试代码,使用Count(),一些调用工作,但最后不工作,我不知道为什么。请帮我解释一下。谢谢。
{{1}}
答案 0 :(得分:3)
Count<int>(new int[] { 1, 2, 3, 4, 5 }, isOdds(int x));
这是无效的。 isOdds返回bool并取整数,它必须像Predicate<int>
。但你不能直接发送它,因为它们不是同一类型。你必须使用另一个lambda。
Count<int>(new int[] { 1, 2, 3, 4, 5 }, x => isOdds(x)); // x => isOdds(x) is now type of Predicate<int>
isEven
同样的事情还有另一种方式。你可以创建新的谓词。
Count<int>(new int[] { 1, 2, 3, 4, 5 }, new Predicate<int>(isOdds));
答案 1 :(得分:0)
基本上delegate Boolean IsOdds<T>(T x)
相当于Predicate<T>
而delegate bool IsEven(int x)
相当于Predicate<int>
所以你可以省略你自己的委托的声明,并写下这样的东西:
private void button1_Click(object sender, EventArgs e)
{
Predicate<int> isOdds = i => i % 2 == 1;
Predicate<int> isEven = i => i % 2 == 0;
Action<int> a = x => this.Text = (x * 3).ToString();
a(3);
Predicate<int> f = delegate (int x) { return x % 2 == 1; };
Predicate<int> ff = x => x % 2 == 1;
MessageBox.Show("lambada " + Count<int>(new int[] { 1, 2, 3, 4, 5 }, x => x % 2 == 1).ToString());
MessageBox.Show("f " + Count<int>(new int[] { 1, 2, 3, 4, 5 }, f).ToString());
MessageBox.Show("ff " + Count<int>(new int[] { 1, 2, 3, 4, 5 }, ff).ToString());
MessageBox.Show("delegate " + Count<int>(new int[] { 1, 2, 3, 4, 5 }, delegate (int x) { return x % 2 == 1; }).ToString());
MessageBox.Show(Count<int>(new int[] { 1, 2, 3, 4, 5 }, isOdds).ToString());
MessageBox.Show(Count<int>(new int[] { 1, 2, 3, 4, 5 }, isEven).ToString());
}