将lambda表达式作为回调传递给扩展方法并将参数传递给它

时间:2017-07-13 05:18:05

标签: c# asp.net-mvc linq lambda

我试图理解lambda表达式,扩展方法,Linq和IEnumerable接口的概念。你可以猜测我对c sharp很新。我已经提出了一个包含所有上述概念的问题。这里我有一个包含三个对象的列表。我想在指定的索引中更改Students对象的name属性。我写了一个接受回调函数的扩展方法.Callback函数接受一个整数索引和一个新的Name字符串。它应该更改name属性并返回对象。但我的代码未能这样做,因为我不知道如何在扩展方法中将参数传递给Func回调。我需要一些助手来理解问题并修复我的错误代码?

class Program
{
    static void Main(string[] args)
    {
        List<Students> students = new List<Students>();

        students.Add(new Students(111443, "sakib"));
        students.Add(new Students(111445, "zami"));
        students.Add(new Students(111444, "habib"));

        var student = students.First();

        var changed1 = students.Change((int num,string newname) => { return students[num].s_name = newname;});


    }
}

public class Students
{
    public int s_id;

    public string s_name;

    public Students(int id, string name)
    {
        this.s_id = id;

        this.s_name = name;
    }
}

public static class LinqHelper
{
    public static IEnumerable<T> Change<T> (this IEnumerable<T> source, Func<int,string,T> callback)
    {
        var myList = new List<Students>();

        myList.Add(callback(1,"zami")); // i was passing parameter here which is not so helpful i guess !

        return myList;

    }
}

2 个答案:

答案 0 :(得分:3)

Func&lt; int,string,T&gt;表示一个函数,它接受一个整数和字符串作为输入,T作为返回类型。您使用的匿名函数的返回类型为&#34;字符串&#34;:

var changed1 = students.Change((int num,string newname) => { return students[num].s_name = newname;});

您应该从函数返回学生实例以使其正常工作。尝试使用以下代码替换上述代码:

var changed1 = students.Change((int index, string newname) => 
                                         {
                                             var studentObj = students[index];
                                             studentObj.s_name = newname;
                                             return studentObj;
                                         });

要允许LinqHelper接受索引和参数,请使用以下命令:

public static class LinqHelper
{
    public static IEnumerable<T> Change<T>(this IEnumerable<T> source, Func<int, string, T> callback, int index, string argument)
    {
        var myList = new List<T>();

        myList.Add(callback(index, argument)); // i was passing parameter here which is not so helpful i guess !

        return myList;

    }
}

然后,您可以按如下方式调用该方法:

var changed1 = students.Change((int index, string newname) => 
                                         {
                                             var studentObj = students[index];
                                             studentObj.s_name = newname;
                                             return studentObj;
                                         }, 
                                         1, 
                                         "zami");

答案 1 :(得分:2)

您还没有创建评估为Func<int, string, T>的lambda。您对Change扩展的调用应如下所示:

var changed1 = students.Change((num, newnam) => {  
                            students[num].s_name = newnam; 
                            return students[num];
                         });

(您应该T要求返回Func