Linq 语法集合

本文深入讲解了LINQ的各种查询方式,包括单个from子句、复合及多个from子句的应用,where子句的多种用法,如使用自定义函数、动态谓词筛选,以及结果投影、分组查询、排序等高级特性。

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

namespace LinqDemo
{
    class Program
    {
        static List<int> numbers = new List<int>() { 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
        static void Main(string[] args)
        {
            #region 单个from子句
            //
            string[] values = { "中国", "日本", "美国", "菲律宾", "越南" };


            //查询包含“国”的字符串
            var valueQuery = from v in values
                             where v.IndexOf("国") > 0
                             select v;


            foreach (var v in valueQuery)
            {
                Console.WriteLine("{0,1}", v);
            }


            #endregion


            IEnumerable<int> queryFactorsOfFour =
          from num in numbers
          where num % 4 == 0
          select num;
     


        }


        #region 复合from子句
        void dd()
        {

            //在查询数据源中,元素的属性是一个集合时,可以使用复合from子句对这个属性集合查询。比如,一个客户,可能有多个电话
            List<CustomerInfo> customers = new List<CustomerInfo> { 
                                           new CustomerInfo{ Name="欧阳晓晓", Age=35, TelTable=new List<string>{"1330708****","1330709****"}},
                                           new CustomerInfo{ Name="上官飘飘", Age=17, TelTable=new List<string>{"1592842****","1592843****"}},
                                           new CustomerInfo{ Name="诸葛菲菲", Age=23, TelTable=new List<string>{"1380524****","1380525****"}}
                                           };
            //查询包含电话号码1592842****的客户
            var query2 = from CustomerInfo ci in customers
                         from tel in ci.TelTable
                         where tel.IndexOf("1592842****") > -1
                         select ci;


            foreach (var ci in query2)
            {
                Console.WriteLine("姓名:{0} 年龄:{1}", ci.Name, ci.Age);
                foreach (var tel in ci.TelTable)
                {
                    Console.WriteLine("          电话:{0}", tel);
                }
            }


        }
        #endregion


        #region 多个from子句
        /// <summary>
        ///  多个from子句查询和复合from子句从字面上看似乎一样,其实是不同的操作。
        ///  复合from子句查询的是单个数据源中的子元素的集合,而多个from子句,是载入多个数据源进行查询。
        /// </summary>
        void formExpDemo()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="诸葛菲菲", Age=23, Tel ="1380524****"}
                                                   };
            List<CustomerInfo> clist2 = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="令狐冲", Age=25, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="东方不败", Age=35, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="任盈盈", Age=23, Tel ="1380524****"}
                                                   };


            //在clist中查找Age大于20的客户,
            //在clist2中查找Age小于30的客户
            var query = from customer in clist
                        where customer.Age > 20
                        from customer2 in clist2
                        where customer2.Age < 30
                        select new { customer, customer2 };


            foreach (var ci in query)
            {
                Console.WriteLine("{0} {1}", ci.customer.Name, ci.customer2.Name);
            }
        }
        #endregion


        #region 常见的where子句查询
        public void c()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="令狐冲", Age=23, Tel ="1380524****"}
                                                   };


            //查询名字是3个字或者姓“令”的,但年龄大于20的客户
            var query = from customer in clist
                        where (customer.Name.Length == 3 || customer.Name.Substring(0, 1) == "令")
                        && customer.Age > 20
                        select customer;


            foreach (var ci in query)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
            }
        }
        #endregion


        #region 在where子句中使用自定义函数
        public void c1()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="令狐冲", Age=23, Tel ="1380524****"}
                                                   };


            //查询名字是3个字并且姓“令”的客户
            var query = from customer in clist
                        where (customer.Name.Length == 3 && CheckName(customer.Name))
                        select customer;


            foreach (var ci in query)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
            }
        }
        private bool CheckName(string name)
        {
            if (name.Substring(0, 1) == "令")
                return true;
            else
                return false;
        }
        #endregion


        #region 动态谓词的筛选
        public void c2()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="令狐冲", Age=23, Tel ="1380524****"}
                                                   };


            //定义动态的谓词数组,这个数组应该由实际运行环境生成
            string[] names = { "令狐冲", "任盈盈", "杨过", "小龙女", "欧阳晓晓" };


            //查询在给定谓词数组里存在的客户
            var query = from customer in clist
                        where names.Contains(customer.Name)
                        select customer;


            foreach (var ci in query)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
            }
        }
        #endregion


        #region 对查询结果进行投影
        public void c3()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="令狐冲", Age=23, Tel ="1380524****"}
                                                   };


            //定义动态的谓词数组,这个数组应该由实际运行环境生成
            string[] names = { "令狐冲", "任盈盈", "杨过", "小龙女", "欧阳晓晓" };


            //查询在给定谓词数组里存在的客户
            var query = from customer in clist
                        where customer.Age < 30
                        select new MyCustomerInfo { Name = customer.Name, Tel = customer.Tel };


            foreach (var ci in query)
            {
                Console.WriteLine("姓名:{0} 电话:{1} 类型{2}", ci.Name, ci.Tel, ci.GetType().FullName);
            }
        }
        #endregion


        #region 分组查询
        /// <summary>
        ///    分组查询对于关系型数据库是非常常见的一种操作,但在没有LINQ之前,对内存的对象进行分组却是一件非常麻烦的事情。
        ///    现在,在LINQ表达式中只需要使用group子句就可以轻松完成对内存对象的分组。
        /// </summary>
        public void c4()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="欧阳锦鹏", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官无忌", Age=23, Tel ="1380524****"}
                                                   };


            //按照名字的前2个字进行分组
            var query = from customer in clist
                        group customer by customer.Name.Substring(0, 2);


            foreach (IGrouping<string, CustomerInfo> group in query)
            {
                Console.WriteLine("分组键:{0}", group.Key);
                foreach (var ci in group)
                {
                    Console.WriteLine("姓名:{0} 电话:{1}", ci.Name, ci.Tel);
                }
                Console.WriteLine("***************************************");
            }
        }
        #endregion


        #region into子句
        /// <summary>
        /// into子句作为一个临时标识符,用于select,group,join子句中。
        /// </summary>
        public void c6()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="欧阳锦鹏", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官无忌", Age=23, Tel ="1380524****"}
                                                   };


            //按照名字的前两个字进行分组,再用分组Key进行排序
            var query = from customer in clist
                        group customer by customer.Name.Substring(0, 2) into gpcustomer
                        orderby gpcustomer.Key descending
                        select gpcustomer;
            Console.WriteLine("into 用于group子句");
            foreach (var group in query)
            {
                Console.WriteLine("分组键:{0}", group.Key);
                foreach (var ci in group)
                {
                    Console.WriteLine("姓名:{0} 电话:{1}", ci.Name, ci.Tel);
                }
                Console.WriteLine("***************************************");
            }


            var query2 = from customer in clist
                         select new { NewName = customer.Name, NewAge = customer.Age } into newCustomer
                         orderby newCustomer.NewAge
                         select newCustomer;


            Console.WriteLine("into 用于select子句");
            foreach (var ci in query2)
            {
                Console.WriteLine("{0} 年龄:{1}", ci.NewName, ci.NewAge);
            }
        }
        #endregion


        #region OrderBy和OrderByDescending
        /// <summary>
        /// OrderBy用于按元素的值进行升序,语法:
        ///orderby 用于排序的元素的表达式
        ///OrderByDescending用于按元素的值进行降序,语法:
        ///orderby 用于排序的元素的表达式 descending
        /// </summary>
        public void c7()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="欧阳锦鹏", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官无忌", Age=23, Tel ="1380524****"}
                                                   };


            //按照年龄升序
            var query = from customer in clist
                        orderby customer.Age
                        select customer;
            Console.WriteLine("按年龄升序排列");
            foreach (var ci in query)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
            }
            //按照年龄升序
            var query2 = from customer in clist
                         orderby customer.Age descending
                         select customer;
            Console.WriteLine("\n按年龄降序排列");
            foreach (var ci in query2)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
            }
        }
        #endregion


        #region ThenBy和ThenByDescending
        /// <summary>
        ///  ThenBy和ThenByDescending用于对元素进行次要排序。基本语法:
        ///orderby 用于排序的元素表达式,用于排序的元素表达式
        ///orderby 用于排序的元素表达式,用于排序的元素表达式 descending
        /// </summary>
        public void c8()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="郭靖", Age=17, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="黄蓉", Age=17, Tel ="1300524****"}
                                                   };


            //按照年龄升序,再按名字的字数次要排序
            var query = from customer in clist
                        orderby customer.Age, customer.Name.Length
                        select customer;
            Console.WriteLine("按年龄排列,按名字字数进行次要排序");
            foreach (var ci in query)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
            }
            //按照年龄升序,再按名字的字数降序次要排序
            var query2 = from customer in clist
                         orderby customer.Age, customer.Name.Length descending
                         select customer;
            Console.WriteLine("\n按年龄排列,按名字字数进行降序次要排序");
            foreach (var ci in query2)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
            }
            //按照年龄升序,再按名字的字数降序要排序,在按电话号码进行第三条件排序
            var query3 = from customer in clist
                         orderby customer.Age, customer.Name.Length, customer.Tel
                         select customer;
            Console.WriteLine("\n按年龄,名字字数,电话号码排序");
            foreach (var ci in query3)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
            }
        }
        #endregion


        #region  let子句
        /// <summary>
        /// let子句用于在LINQ表达式中存储子表达式的计算结果。let子句创建一个范围变量来存储结果,变量被创建后,
        ///不能修改或把其他表达式的结果重新赋值给它。此范围变量可以再后续的LINQ子句中使用。 
        /// </summary>
        public void c9()
        {
            //
            List<CustomerInfo> clist1 = new List<CustomerInfo> { 
                                                   new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
                                                   new CustomerInfo{ Name="郭靖", Age=17, Tel ="1330708****"},
                                                   new CustomerInfo{ Name="黄蓉", Age=17, Tel ="1300524****"}
                                                   };




            //姓“郭”或“黄”的客户
            var query1 = from customer in clist1
                         let g = customer.Name.Substring(0, 1)
                         where g == "郭" || g == "黄"
                         select customer;
            foreach (var ci in query1)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", ci.Name, ci.Age, ci.Tel);
            }
        }
        #endregion


        #region join子句
        /// <summary>
        /// 如果一个数据源中元素的某个属性可以跟另一个数据源中元素的属性进行相等比较,那么这两个数据源可以用join子句进行关联。
        /// jion子句用equals关键字进行比较,而不是常见的==
        /// </summary>
        public void c10()
        {
            List<CustomerInfo> clist = new List<CustomerInfo> 
            { 
               new CustomerInfo{ Name="欧阳晓晓", Age=35, Tel ="1330708****"},
               new CustomerInfo{ Name="上官飘飘", Age=17, Tel ="1592842****"},
               new CustomerInfo{ Name="郭靖", Age=17, Tel ="1330708****"},
               new CustomerInfo{ Name="黄蓉", Age=17, Tel ="1300524****"}
            };


            List<CustomerTitle> titleList = new List<CustomerTitle> 
            { 
               new CustomerTitle{ Name="欧阳晓晓", Title="歌手"},
               new CustomerTitle{ Name="郭靖", Title="大侠"},
               new CustomerTitle{ Name="郭靖", Title="洪七公徒弟"},
               new CustomerTitle{ Name="黄蓉", Title="才女"},
               new CustomerTitle{ Name="黄蓉", Title="丐帮帮主"}
            };


            //根据姓名进行内部联接
            Console.WriteLine("内部联接");
            var query = from customer in clist
                        join title in titleList
                        on customer.Name equals title.Name
                        select new { Name = customer.Name, Age = customer.Age, Title = title.Title };
            foreach (var ci in query)
            {
                Console.WriteLine("姓名:{0} 年龄:{1} {2}", ci.Name, ci.Age, ci.Title);
            }


            //根据姓名进行分组联接
            Console.WriteLine("\n根据姓名进行分组联接");
            var query2 = from customer in clist
                         join title in titleList
                         on customer.Name equals title.Name into tgroup
                         select new { Name = customer.Name, Titles = tgroup };
            foreach (var g in query2)
            {
                Console.WriteLine(g.Name);
                foreach (var g2 in g.Titles)
                {
                    Console.WriteLine("   {0}", g2.Title);
                }
            }


            //根据姓名进行 左外部联接
            Console.WriteLine("\n左外部联接");
            var query3 = from customer in clist
                         join title in titleList
                         on customer.Name equals title.Name into tgroup
                         from subTitle in tgroup.DefaultIfEmpty()
                         select new { Name = customer.Name, Title = (subTitle == null ? "空缺" : subTitle.Title) };
            foreach (var ci in query3)
            {
                Console.WriteLine("姓名:{0} {1} ", ci.Name, ci.Title);
            }
        }
        #endregion


    }


    public class CustomerInfo
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public List<string> TelTable { get; set; }
        public string Tel { get; set; }
    }


    public class CustomerTitle
    {
        public string Name { get; set; }
        public string Title { get; set; }
    }


    public class MyCustomerInfo
    {
        public string Name { get; set; }
        public string Tel { get; set; }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值