C# Linq 学会使用,学会自己编写Linq

Linq我暂时理解为,一种内置的非常方便的数据查询的工具

使用

我们先学习它的使用

//数据类

    public class DataTest
    {
        /// <summary>
        /// 编号
        /// </summary>
        public int id;
        /// <summary>
        /// 名字
        /// </summary>
        public string name;
        /// <summary>
        /// 介绍
        /// </summary>
        public string describe;
        /// <summary>
        /// 年龄
        /// </summary>
        public int age;

    }

//新建了一个List数据,用来测试数据查询 

  List<DataTest> dataTests = new List<DataTest>()
            {
                new DataTest(){
                    id = 0,
                    name = "一",
                    describe ="介绍",
                    age = 10
                },
                new DataTest(){
                    id = 1,
                    name = "二",
                    describe ="介绍",
                    age = 20
                },
                new DataTest(){
                    id = 2,
                    name = "三",
                    describe ="介绍",
                    age = 30
                },
                new DataTest(){
                    id = 3,
                    name = "四",
                    describe ="介绍",
                    age = 40
                },   
                new DataTest(){
                    id = 4,
                    name = "五",
                    describe ="介绍",
                    age = 50
                },   
                new DataTest(){
                    id = 5,
                    name = "六",
                    describe ="介绍",
                    age = 60
                },
            };

//现在定义一个需求,需要查出id>2的数据

我们一般的写法,应该是foreach

Console.WriteLine("**************foreach遍历*****************");
foreach (var item in dataTests)
{
    if (item.id > 2) {
    Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
    }
}

现在我们用Linq的方式来写

引用Linq的命名空间

using System.Linq;

 引用命名空间之后,我们的list对象,拥有了一个扩展方法,Where

(扩展方法,在之前的博客有专门讲过)

我们现在看看Where怎么用

我们看到Where函数是 需要一个Func的参数 func的参数是我们的数据,返回值是一个bool

 我们F12 查看,Func类的介绍,防止你们这一步看不懂了

Linq扩展方法写法

我们用Lambda表达式来写的话,就是这个样子的

(Lambda表达式,在之前的博客也有专门讲过)

var list = dataTests.Where(d => d.id > 2);
"匿名函数的写法,熟练的同学用上面这种方式写,更简洁"
//var list = dataTests.Where((DataTest d)=> { return d.id > 2; });
//var list = dataTests.Where(delegate (DataTest d){ return d.id > 2; });

"上面这一步,就已经取出我们需要的值, 下面这个循环只做输出用"
foreach (var item in list)
{
    Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
}

现在我们改变一下需求,用Linq的别的写法age < 30同时ID不等于0

Linq关键字写法

这个写法应该学过数据库的同学,应该更容易理解

var list = from d in dataTests
           where d.age < 30 && d.id != 0
           select d;

foreach (var item in list)
{
    Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
}

结果是只有一条数据符合要求,证明我们的写法都是正确的

 自己编写Linq

为了方便理解,我们自己也写一个同样功能的Linq

这里看不懂的还是要回去看看扩展方法那一节

public static class Extension
{
    public static List<DataTest> MyWhere(this List<DataTest> resource ,Func<DataTest,bool> func)
    {
        var list = new List<DataTest>();

        foreach (var item in resource)
        {
            if (func(item)) {
                list.Add(item);
            }
        }

        return list;
    }
}

//其实Linq就是把我们要写的循环封装了

我们现在使用自己写的Linq,看看效果怎么样

var list = dataTests.MyWhere((d)=> d.age < 30 && d.id != 0);

foreach (var item in list)
{
    Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
}

 

效果完全一样.但是我们的这个复用性太低了,我们用泛型给它改一下 

  public static List<T> MyWhereCommon<T>(this List<T> resource, Func<T, bool> func)
        {
            var list = new List<T>();

            foreach (var item in resource)
            {
                if (func(item))
                {
                    list.Add(item);
                }
            }

            return list;
        }
 var list = dataTests.MyWhereCommon((d)=> d.age < 30 && d.id != 0);

                foreach (var item in list)
                {
                    Console.WriteLine($"id:{item.id} name:{item.name} age:{item.age}");
                }

用法没变,但是我们别的集合也可以通用了

当然,举一反三,大家可以可以通过这个写法,写出更多适合需求的工具

猜你喜欢

转载自blog.csdn.net/Liu_ChangC/article/details/121768468
今日推荐