gpt4 book ai didi

c# - 如何在没有 lambda 的情况下使用 linq 扩展?

转载 作者:行者123 更新时间:2023-11-30 19:20:29 24 4
gpt4 key购买 nike

这个例子纯粹是为了学习,否则我会马上使用Lambda表达式。

我想尝试使用不带 lambda 的 Where() 扩展方法,只是为了看看它的外观,但我不知道如何让它编译和正常工作。这个例子毫无意义,所以不要费心试图找出它的任何逻辑。

我基本上只是想知道是否可以在不使用 lambda 的情况下使用扩展方法(仅用于学习目的)以及它在代码中的样子。

让我感到困惑的是 Where() 条件接受 Func<int,bool> , 但该方法返回 IEnumerable<int> ?按照 Func 的定义方式,它接受一个 int 并返回一个 bool。如果这是 Func<int, bool, IEnumberable<string>> 对我来说更有意义

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Delegates
{
public class Learning
{
/// <summary>
/// Predicates - specialized verison of Func
/// </summary>
public static void Main()
{
List<int> list = new List<int> { 1, 2, 3 };

Func<int, bool> someFunc = greaterThanTwo;
IEnumerable<int> result = list.Where(someFunc.Invoke(1));

}


static IEnumerable<int> greaterThanTwo(int arg, bool isValid)
{
return new List<int>() { 1 };
}

}
}

更新代码

public class Learning
{
/// <summary>
/// Predicates - specialized verison of Func
/// </summary>
public static void Main()
{
// Without lambda
List<int> list = new List<int> { 1, 2, 3 };

Func<int, bool> someFunc = greaterThanTwo;
// predicate of type int
IEnumerable<int> result = list.Where(someFunc);

}


static bool greaterThanTwo(int arg, bool isValid)
{
return true;
}

}

我收到以下错误:

“greaterThanTwo”没有重载匹配委托(delegate)“System.Func”

最佳答案

Where接受一个函数,该函数接受单个元素(在本例中为 int )作为参数,并接受 bool 值作为其返回类型。这称为谓词 - 它给出"is"或“否”的答案,可以反复应用于同一类型的元素序列。

你在 greaterThanTwo 处出错了函数 - 它接受两个参数,而不是一个 - 并返回 IEnumerable<int> - 所以它与 Func<int, bool> 完全不兼容.它应该需要 int并返回 bool - 同样,这是一个谓词(见上文)。

一旦你解决了这个问题,你的另一个问题是 Invoke - 没有调用任何东西 - 你正在将一个委托(delegate)(指针)交给一个方法,以及 Where 内部的内容将在需要时负责调用它。

试试这个:

static bool greaterThanTwo(int arg)
{
return (arg > 2);
}

//snip

Func<int, bool> someFunc = greaterThanTwo;
IEnumerable<int> result = list.Where(someFunc);

关于c# - 如何在没有 lambda 的情况下使用 linq 扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6117898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com