在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
语句作为参数Func<int,bool>
获取。您需要编写获取int并返回true
或false
的函数
试试这样的东西:
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;