在Where方法中传递委托对象

时间:2016-07-26 09:14:18

标签: c# delegates

using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Where_MethodGroup
{
    public delegate List<int> WhereDelegate(List<int> list);
    class Program :IEnumerable
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>();
            list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
            WhereDelegate lessThanFive;
            lessThanFive = GroupConversionMethod;
            IEnumerable<int> query = list.Where(lessThanFive);
            foreach (int i in query)
            {
                Console.WriteLine(i);
            }
        }
        public static List<int> GroupConversionMethod(List<int> list1)
        {
            Console.WriteLine("Integers less than 5 are :");
            foreach (int i in list1)
            {
                if (i < 5)
                {
                    yield return i;
                }
            }
        }
    }
}

我必须通过在where方法中传递委托对象来查找少于五个的所有元素。在定义委托对象时,使用方法组转换语法来使用回调函数(通过new运算符定义委托对象)。

我收到错误:

IEnumerable<int> query = list.Where(lessThanFive)

哪个方法有一些无效的参数,这个错误的合理解决方法是什么?

3 个答案:

答案 0 :(得分:1)

在这种情况下,Where个参数作为参数Func<int,bool>获取。 您需要编写获取int并返回truefalse

的函数

尝试这样的事情:

class Program
{
    static void Main(string[] args)
    {
        List<int> list = new List<int>();
        list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
        IEnumerable<int> query = list.Where(isInGroup);
        foreach (int i in query)
        {
            Console.WriteLine(i);
        }
    }

    public static bool isInGroup(int elem)
    {
        return elem < 5;
    }
}

答案 1 :(得分:1)

问题是你正在尝试创建一个委托,它将一个列表作为参数并返回一个整数列表,同时你逐个发送linq Where方法elemets(所以只有一个整数)和您期望返回bool

如果您将委托的签名更改为这样,它将起作用:

public delegate bool WhereDelegate(int element);

然后你可以用以下方式调用它:

static void Main(string[] args)
    {
        WhereDelegate del = (int element) => element < 5;
        List<int> list = new List<int>();
        list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
        IEnumerable<int> query = list.Where(x => del(x));  
    }

使用lambda运算符=>

这相当于编写一个方法并将其分配给委托:

public static bool Method(int i)
{
     return i < 5;
}

然后在委托实例化:

WhereDelegate del = Method;

如果您想使用指定的new关键字(即使在这种情况下不需要),您可以写:

WhereDelegate del = new WhereDelegate((int element) => element < 5);

WhereDelegate del = new WhereDelegate(Method);

创建委托时。

答案 2 :(得分:0)

您可以尝试以下操作:

IEnumerable<int> query = list.Where(c => c < 5);

or

IEnumerable<int> query = from e in list
where e < 5
select e;