微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

没有lambda的情况下如何使用linq扩展?

如何解决没有lambda的情况下如何使用linq扩展?

| 这个例子纯粹是为了学习,否则我会马上使用Lambda表达式。 我想尝试使用不带lambda的Where()扩展方法只是为了看它的外观,但是我不知道如何使它编译和正常工作。该示例没有任何意义,因此请不要试图找出任何逻辑。 我基本上只是想知道是否可以在不使用lambda的情况下使用扩展方法(仅用于学习目的)以及代码中的外观。 我很困惑的是Where()条件取一个
Func<int,bool>
,但是该方法返回一个
IEnumerable<int>
? Func的定义方式,它接受一个int并返回一个布尔值。如果这是ѭ2,对我来说更有意义
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,bool> someFunc = greaterThanTwo;
            // predicate of type int
            IEnumerable<int> result = list.Where(someFunc);

        }


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

    }
我收到以下错误: \'greaterThanTwo \'没有重载匹配委托\'System.Func \'     

解决方法

Where
接受一个函数,该函数接受单个元素(在本例中为
int
)作为参数,并接受布尔值作为其返回类型。这称为谓词-它给出一个“是”或“否”的答案,可以一次又一次地应用于相同类型的元素序列。 您在
greaterThanTwo
函数上出错了-它接受两个参数而不是一个-并返回
IEnumerable<int>
-因此它与
Func<int,bool>
完全不兼容。它应该取6并返回11,这又是一个谓词(请参见上文)。 解决这个问题后,另一个问题是
Invoke
-您什么都没有调用-您正在将委托(指针)传递给某个方法,而
Where
内的勇气将在需要时进行调用。 尝试这个:
static bool greaterThanTwo(int arg)
{
    return (arg > 2);
}

//snip

Func<int,bool> someFunc = greaterThanTwo;
IEnumerable<int> result = list.Where(someFunc);
    ,定义“ 15”定义了一个委托,该委托采用类型为“ 16”的单个参数并返回类型为“ 17”的结果。 Linqs的``5''子句是针对``19''定义的(间接地通过扩展方法),并采用类型为``21''的参数(
Where
的基本版本),该参数基本上表示该函数必须采用
IEnumerable
类型的参数并返回
bool
值。 为了使示例工作:
bool greaterThanTwo(int arg)
{
    // this needs to be a boolean operation against the arg
    return arg > 2;
}

// and invoke like
list.Where(greaterThanTwo);
    ,
Func<int,bool>
意味着您有一个接受一个int并返回bool的函数。如果要在函数中使用更多参数,可以将其列出,但是定义的最后一个泛型类型是该函数的返回类型。如果您想将其定义为Func,则您的方法将看起来像这样,ѭ26function函数应该看起来像这样。
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);

        }


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

    }
}
    ,
Where()
函数对每个项目执行一次lambda。如果您想返回,请说出“ѭ29”,而应使用“ѭ30”来提供该功能。但是
Where()
会根据lambda的布尔返回值自动添加或不添加项目。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。