C#高级 11自定义linq查询

本文介绍了如何在C#中使用自定义Linq查询,通过封装变化的参数和使用委托处理可变代码块,对比了官方Linq查询与自定义查询在`Program.cs`中的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义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;

    }
}

运行结果如下所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值