关于c#:C高级篇初识LINQ

49次阅读

共计 5186 个字符,预计需要花费 13 分钟才能阅读完成。

前言

揭示:为了可能将知识点学得更加透彻、记得更加牢固 我会通过教学解说的形式把常识写下来 因为在过程中会让人从学生变成老师 这个过程会开掘出新的常识和观点 是一个自我思维切换而达成的常识深度开掘和晋升的过程 如果能帮忙到大家那就最好 如果有讲错的中央还请多多指教!我只是一只菜鸡 感激了解!


1、初识 LINQ

置信大家多多少少都在网上或者书里看到过 LINQ 这玩意,那它到底是个什么玩意呢?明天就和大家一起来学习下 LINQ

LINQ 是集成到 C# 和 VB .NET 这些语言中用于 提供查问数据能力 的一个新特色

在关系型数据库中,数据被组织放入规范性很好的表中,并且通过简略而又弱小的语言 SQL 来进行拜访,然而程序中却与数据库相同,保留在类对象或构造中的数据差别很大,因而没有通用的查问语句来从数据结构中获取数据,自 C#3.0 引入 LINQ 后,咱们便有了查问对象数据的能力

就是说 LINQ 是 C# 提供给了咱们开发者一个疾速查问数据的能力

LINQ———– 让语言更柔美,让查问更便捷,让代码更杰出。


2、简略的 LINQ 案例

先来一个示例,让大伙看看 LINQ 的魅力所在

要应用 LINQ 的话就要援用它所在的命名空间 using System.Linq;

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{

    class GameText
    {
        public int gameID;                  // 游戏 ID
        public string gameName;             // 游戏名称
        public string gameIntduced;         // 游戏介绍
        public int gameSize;                // 游戏大小
    }

    class Program
    {static List<GameText> game = new List<GameText>()
        {new GameText(){gameID = 1,gameName = "东凑西凑",gameIntduced = "这是一个 2D 实习面试我的项目",gameSize = 1},
            new GameText(){gameID = 2,gameName = "同桌的你",gameIntduced = "这是一个青春校园题材的游戏",gameSize = 5},
        };

        static void Main(string[] args)
        {

            var res = from m in game
                      where m.gameID > 1
                      select m.gameName;

            foreach (var item in res)
            {Console.WriteLine(item);
            }
        }
    }
}

次要看这个中央

     var res = from m in game
          where m.gameID > 1
          select m.gameName;

from in 都是关键字 game 是咱们要查问的数据的对象 m 示意 game 外面的元素

where 是用来做条件限度的 这里我写了一个 m.gameID > 1 的条件 意思就是查问 game 汇合中的 gameID 大于 1 的元素

select m.gameName 查出满足条件的游戏并返回它的游戏名称

咱们来看下输入后果

东凑西凑游戏 ID 为 1 同座的你 ID 为 2

where m.gameID > 1

显然是同座的你这款游戏符合条件 所以最初咱们失去的是同座的你这款游戏

看吧是不是很简略,本人入手敲一下马上就能了解了!


3、对于 LINQ 的不同语法

刚刚的案例讲的是 LINQ 表达式的写法也称(查问语法),这里咱们还能够应用办法语法来进行数据查问

查问语法 (query syntax) 是申明模式的,看上去和 SQL 语句很类似。查问语法应用查问表达式模式书写。

办法语句 (method syntax) 是命令模式的,它应用的是规范的办法调用。办法是一组叫做规范查问运算符的办法

只有咱们援用了 System.Linq; 咱们就能够调用 Where 办法

System.Linq 命名空间下有一个 Enumerable 类

Enumerable 类为咱们开发者提供了超多扩大办法和共享方法,这外面水应该挺深了没怎么钻研跳过,咱们间接操作汇合而后. 调用外面的 where 办法就好了

它须要咱们传入一个 Func 委托 这里有两种写法

一种是用 Lambda 表达式来做,另一种就是比拟麻烦的独自写一个办法

先来麻烦的、其实也简略 Where 就是做过滤用的,外部会让汇合每个元素都调用咱们传进行的办法 所以咱们要写一个参数为 GameText、返回值为 bool 的办法传到 where 中


//var res = from m in game
//          where m.gameID > 1
//          select m.gameName;

var res = game.Where(whereFunc);


foreach (var item in res)
{Console.WriteLine(item.gameName.ToString());
}


static bool whereFunc(GameText t)
{if (t.gameID > 1) return true;
    return false;
}

            

启动程序 输入也是 同座的你 没故障老铁

嗯确实也就几步 不算太麻烦,然而 Lambda 表达式能让它更加简单化


//var res = from m in game
//          where m.gameID > 1
//          select m.gameName;

//var res = game.Where(whereFunc);

var res = game.Where(g => g.gameID > 1);

foreach (var item in res)
{Console.WriteLine(item.gameName.ToString());
}


//static bool whereFunc(GameText t)
//{//    if (t.gameID > 1) return true;
//    return false;
//}

还是输入了同座的你 没故障!

4、LINQ 多表查问操作

要进行多表操作咱们就要学习联结查问,学过 SQL 的同学应该对联结并不生疏,恰好我只是略微碰过 SQL 一下,头一回学联结这个知识点,那它到底是个什么玩意呢?

联结查问承受两个汇合而后创立一个长期的对象汇合,要想进行联结操作那就必须每个源对象中须要共享某个能够进行比拟,以判断是否相等的值才能够进行联结

间接上示例 一看示例就懂了

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{

    class Gamer
    {
        public int id;
        public string playName;
    }

    class GameText
    {
        public string gameName;
        public int id;
    }

    class Program
    {static List<Gamer> game = new List<Gamer>()
        {new Gamer(){id = 0,playName = "小红"},
            new Gamer(){id = 1,playName = "小黑"},
            new Gamer(){id = 2,playName = "小蓝"},
            new Gamer(){id = 3,playName = "小黄"},
            new Gamer(){id = 4,playName = "小小"},
        };

        static List<GameText> game2 = new List<GameText>()
        {new GameText(){gameName = "东凑西凑",id = 1},
            new GameText(){gameName = "东凑西凑",id = 4},
            new GameText(){gameName = "同座的你",id = 0},
            new GameText(){gameName = "同座的你",id = 2},
            new GameText(){gameName = "同座的你",id = 3},

        };
    }
}

当初咱们有两个类

Gamer 存储的是玩家的 ID 和名字
GameText 存储的是游戏的名字和玩耍此游戏玩家的 ID

当初咱们单纯查 game 表只能失去玩家的名字和 ID 并不能查到这个玩家玩的是哪一款游戏,这个时候咱们就能够用到 LINQ 里的联结操作(join 子句)

static void Main(string[] args)
{

var res = from g in game
          join g2 in game2 on g.id equals g2.id
          where g2.gameName == "同座的你"
          select new {playerName = g.playName, gameName = g2.gameName}; // 匿名类型对象


    //var res = game.Where(g => g.gameID > 1);

    foreach (var item in res)
    {Console.WriteLine(item);
    }
}

后面几个关键字都解释过了 这里就讲讲 join 的操作

join g2 in game2 这句话齐全的意思和 from g in game 一样的
(这里要留神查问表达式必须从 from 子句开始)

from 前面跟的是要做查问的对象
join 前面跟的是要联结的对象(示意要和那个汇合做联结)
on 前面是联结条件

如果 g.id 和 g2.id 相等 就判断上面的条件 where g2.gameName == “ 同座的你 ”

**Gamer 存储的是玩家的 ID 和名字
GameText 存储的是游戏的名字和玩耍此游戏玩家的 ID**

他们的 ID 雷同并且玩的是同座的你这款游戏那就满足了查问条件

回去看回咱们的那个表 是不是 小红 小蓝 小黄 这三个人玩的是同座的你这款游戏

嗯输入的后果 没故障

这里如同还有一种叫联结查问,我没有搞懂他们两个之间的关系,感觉实质上是一样的也是能够进行多表查问操作,坐等哪位老哥教教弟弟!

这里我也把联结查问的写进去 其余货色都不须要变

static void Main(string[] args)
{
    var res = from g in game
              from g2 in game2
              where g.id == g2.id && g2.gameName == "东凑西凑"
              select new {playerName = g.playName, gameName = g2.gameName};

    foreach (var item in res)
    {Console.WriteLine(item);
    }
}

不多解释了 应该不难理解吧。


5、LINQ 对查问后果做排序操作

这里介绍 orderby 子句

orderby 子句承受一个表达式并依据表达式一次返回后果项

orderby 子句默认排序是升序,咱们也能够通过 ascending 和 descending 关键字显式设置元素的排序为升序还是降序

一起来看看示例

就加了一句 orderby g.id descending 其余代码不变

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{

    class Gamer
    {
        public int id;
        public string playName;
    }

    class GameText
    {
        public string gameName;
        public int id;
    }

    class Program
    {static List<Gamer> game = new List<Gamer>()
        {new Gamer(){id = 0,playName = "小红"},
            new Gamer(){id = 1,playName = "小黑"},
            new Gamer(){id = 2,playName = "小蓝"},
            new Gamer(){id = 3,playName = "小黄"},
            new Gamer(){id = 4,playName = "小小"},
        };

        static List<GameText> game2 = new List<GameText>()
        {new GameText(){gameName = "东凑西凑",id = 1},
            new GameText(){gameName = "东凑西凑",id = 4},
            new GameText(){gameName = "同座的你",id = 0},
            new GameText(){gameName = "同座的你",id = 2},
            new GameText(){gameName = "同座的你",id = 3},
        };

        static void Main(string[] args)
        {
            var res = from g in game
                      join g2 in game2 on g.id equals g2.id
                      where g2.gameName == "同座的你"
                      orderby g.id descending
                      select new {playerName = g.playName, gameName = g2.gameName};

            foreach (var item in res)
            {Console.WriteLine(item);
            }
        }
    }
}

因为默认咱们 ID 就是 0 1 2 3.. 升序的 所以咱们把数据倒序来看看成果

升序状态下应该输入的是 小红小蓝小黄
咱们用 orderby g.id descending 按 g.id 来倒序输入后果
所以输入了小黄 小蓝 小红

正文完
 0