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)
哪个方法有一些无效的参数,这个错误的合理解决方法是什么?
答案 0 :(得分:1)
在这种情况下,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;
}
}
答案 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;