我试图理解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;
}
}
答案 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
。