乐趣区

关于c#:CLINQ的基本用法

LINQ 是什么?

LINQ 是 Language Integrated Query(语言集成查问的缩写), 微软官网对其的形容:

语言集成查问 (LINQ) 是一系列间接将查问性能集成到 C# 语言的技术统称。

根本用法是什么?

(我目前也只会最根本的用法。。)
LINQ 查问操作由三个不同的操作组成:

  1. 获取数据源
  2. 创立查问
  3. 执行查问

上面我将用我学习时用的一个小例子来演示。
有两个数据源: 武林高手的汇合和武林绝学的汇合。
我用的是两个汇合, 实际上不只是汇合能够作为数据源
微软官网文档提到:

上例中1,数据源是一个数组,因而它隐式反对泛型 IEnumerable<T> 接口。这一事实意味着该数据源能够用 LINQ 进行查问。

说回我的例子,我实现了两个类:

  • MatialArtsMaster示意武林高手:

        // 武林高手
    class MatialArtsMaster
    {public int ID { get; set;}
        public string Name {get; set;}
        public int Age {get; set;}
        public string Menpai {get; set;}
        public string Kongfu {get; set;}
        public int Level {get; set;}
        public override string ToString()
        {return string.Format("id:{0},name:{1},age:{2},menpai:{3},kongfu:{4},level:{5}", this.ID, this.Name, this.Age, this.Menpai, this.Kongfu, this.Level);
        }
    }
  • Kongfu 示意武林绝学:

        // 武学
    class Kongfu
    {public int Id { get; set;}
        public string Name {get; set;}
        public int Power {get; set;}
        public Kongfu() {}
        public Kongfu(int id, string name, int power)
        {
            Id = id;
            Name = name;
            Power = power;
        }
        public override string ToString()
        {return string.Format("Id:{0},Name:{1},Power:{2}", this.Id, this.Name, this.Power);
        }
    }

而后填充两个汇合:

        static void Main(string[] args)
        {
            var MasterList = new List<MatialArtsMaster>
            {new MatialArtsMaster(){ID=001,Name="黄蓉",Age=18,Menpai="丐帮",Kongfu="打狗棒法",Level=9},
                new MatialArtsMaster(){ID=002,Name="洪七公",Age=70,Menpai="丐帮",Kongfu="打狗棒法",Level=10},
                new MatialArtsMaster(){ID=003,Name="郭靖",Age=22,Menpai="丐帮",Kongfu="降龙十八掌",Level=10},
                new MatialArtsMaster(){ID=004,Name="任我行",Age=50,Menpai="明教",Kongfu="葵花宝典",Level=1},
                new MatialArtsMaster(){ID=005,Name="东方不败",Age=35,Menpai="明教",Kongfu="葵花宝典",Level=10},
                new MatialArtsMaster(){ID=006,Name="林平之",Age=23,Menpai="华山",Kongfu="葵花宝典",Level=7},
                new MatialArtsMaster(){ID=007,Name="岳不群",Age=50,Menpai="华山",Kongfu="岳不群",Level=8},
                new MatialArtsMaster(){ID=008,Name="令狐冲",Age=23,Menpai="华山",Kongfu="独孤九剑",Level=10},
                new MatialArtsMaster(){ID=009,Name="梅超风",Age=23,Menpai="梅花岛",Kongfu="九阴真经",Level=8},
            };
            var kungfuList = new List<Kongfu>()
            {new Kongfu(){Id=1,Name="打狗棒法",Power=90},
                new Kongfu(){Id=2,Name="降龙十八掌",Power=95},
                new Kongfu(){Id=3,Name="葵花宝典",Power=100},
                new Kongfu(){Id=4,Name="独孤九剑",Power=100},
                new Kongfu(){Id=5,Name="九阴真经",Power=100},
            };
        }

接下来就是查问了,根本的 LINQ 查问操作次要通过 from,in,select,where 关键字实现。例如:

  • 查问修炼 葵花宝典 的武林高手:

            var res = from master in MasterList
                      where master.Kongfu == "葵花宝典"
                      select master;
            foreach(var temp in res)
            {Console.WriteLine(temp.ToString());
            }
            //id: 4,name: 任我行,age: 50,menpai: 明教,kongfu: 葵花宝典,level: 1
            //id: 5,name: 东方不败,age: 35,menpai: 明教,kongfu: 葵花宝典,level: 10
            //id: 6,name: 林平之,age: 23,menpai: 华山,kongfu: 葵花宝典,level: 7
  • 查问所有武林高手的名字:

            var res = from master in MasterList
                      select master.Name;
            foreach(var temp in res)
            {Console.WriteLine(temp.ToString());
            }
            // 黄蓉
            // 洪七公
            // 郭靖
            // 任我行
            // 东方不败
            // 林平之
            // 岳不群
            // 令狐冲
            // 梅超风

微软官网将 from 关键字后的那个变量称为 范畴变量:

范畴变量就像 foreach 循环中的迭代变量,但查问表达式中不会真正产生迭代。当执行查问时,范畴变量将充当对 customers 中每个间断的元素的援用。

这种写法写起来和 SQL 语句十分相似,逻辑性能也基本上一样,所以如果曾经会 SQL 的话会很容易了解。

扩大办法

除了这样的规范写法,还能够通过数据源的扩大办法来实现 LINQ 查问。最简略易懂的一个办法是 where() 办法。

  • 如要查问所有修炼等级大于 8 的武林高手:

            var res = MasterList.Where(master => master.Level > 8);
            foreach(var temp in res)
            {Console.WriteLine(temp.ToString());
            }
            //id: 1,name: 黄蓉,age: 18,menpai: 丐帮,kongfu: 打狗棒法,level: 9
            //id: 2,name: 洪七公,age: 70,menpai: 丐帮,kongfu: 打狗棒法,level: 10
            //id: 3,name: 郭靖,age: 22,menpai: 丐帮,kongfu: 降龙十八掌,level: 10
            //id: 5,name: 东方不败,age: 35,menpai: 明教,kongfu: 葵花宝典,level: 10
            //id: 8,name: 令狐冲,age: 23,menpai: 华山,kongfu: 独孤九剑,level: 10

扩大办法还有很多,如 SelectSelectManyJoinOrderby。他们的具体用法可参阅微软官网文档 - 扩大办法。

最初

LINQ 是一项弱小的技术,我才理解了一点点 LINQ 的常识(甚至可能还有谬误,如果有请肯定斧正!),放弃学习才是短暂之道。


  1. 这个例子指的是微软官网文档中的例子而不是本文中我的例子。↩
退出移动版