在Where方法中传递委托对象

本文关键字:对象 Where 方法 | 更新日期: 2023-09-27 17:58:40

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方法中传递委托对象来查找少于五个的所有元素。定义委托对象时,使用要使用的回调函数的方法组转换语法(通过新运算符定义委托对象(。

我收到了错误的行:

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

如果方法有一些无效的参数,那么这个错误的合理修复方法是什么?

在Where方法中传递委托对象

在这种情况下,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;
    }
}

问题是,当您逐个发送linq Where方法元素(因此只有一个整数(时,您正试图生成一个以列表为参数并返回整数列表的委托,而您希望返回一个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);

创建代理时。

您可以尝试以下操作:

IEnumerable<int> query = list.Where(c => c < 5);
or
IEnumerable<int> query = from e in list
where e < 5
select e;