自定义Linq查询遵循的原则是封装,即变化的作为参数,不变的作为方法体;
可能有人会问,如果也想把方法体内的某段代码作为参数进行传入呢?
答案是:使用委托,因为委托可以把一个代码块,或者一段代码独立出来。
下面将先展示官方Linq查询 VS 自定义Linq查询(封装+委托)
首先考略到读者可以直接复制代码,先给出项目运行文件和代码
如上图所示,这需要框中的三个文件就行
StuClass.cs代码如下所示:
internal class StuClass
{
public int Id { get; set; }
public string ClassName { get; set; }
public override string ToString()
{
return string.Format("id:{0}, ClassName:{1}", Id, ClassName);
}
}
Student.cs代码如下所示:
internal class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int ClassId { get; set; }
public int Age { get; set; }
public override string ToString()
{
return string.Format("id:{0}, Name:{1}, ClassId:{2}, Age:{3}", Id, Name, ClassId, Age);
}
}
最后是Program.cs内代码
internal class Program
{
#region 初始化数据
List<Student> students = new List<Student>()
{
new Student()
{
Id = 0,
Name = "编程1",
ClassId = 2,
Age = 25
},
new Student()
{
Id = 1,
Name = "编程2",
ClassId = 2,
Age = 26
},
new Student()
{
Id = 2,
Name = "编程3",
ClassId = 3,
Age = 31
},
new Student()
{
Id = 3,
Name = "编程4",
ClassId = 3,
Age = 32
},
new Student()
{
Id = 4,
Name = "编程5",
ClassId = 3,
Age = 34
},
};
List<StuClass> stuClasses = new List<StuClass>()
{
new StuClass() {Id=1,ClassName="小跟班"},
new StuClass() {Id=2,ClassName="C#班"},
new StuClass() {Id=3,ClassName=".net core班"},
new StuClass() {Id=4,ClassName="webAPI"},
};
#endregion
//主方法
static void Main(string[] args)
{
Program program = new Program();
//官方Linq和自定义linq在Show方法中调用
program.Show();
Console.ReadKey();
}
public void Show()
{
{
//委托分装代码块
Func<Student, bool> func = test;
//自定义Linq
List<Student> list3 = students.AntWhere(func).ToList();
foreach (var item in list3)
{
Console.WriteLine(item);
}
//官方Linq方法(扩展方法方式的)
List<Student> list4 = students.Where(x => x.Age < 30).ToList();
}
}
public static bool test(Student student)
{
return student.Age < 30;
}
}
public static class LinqExtend
{
//自定义linq必须是静态方法,同时同时传递数据对象时必须使用this 关键字
public static IEnumerable<TSource> AntWhere<TSource>(this IEnumerable<TSource> resource, Func<TSource, bool> func)
{
List<TSource> list2 = new List<TSource>();
foreach (var item in resource)
{
if (func.Invoke(item))
{
list2.Add(item);
}
}
return list2;
}
}
运行结果如下所示: