Linq 小结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/stu_20052369/article/details/88119194

using LinqDemo1;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            var strArr = new[] { "aa", "ab", "bb" };

            var result1 = Array.FindAll(strArr, item => (item.IndexOf("a") > -1 && item.IndexOf("b") > -1));
            var result2 = from item in strArr where item.IndexOf("a") > -1 select item;
            var result3 = strArr.Where(item => item.IndexOf("a") > -1).Select(item => item);


            foreach (var v in result3)
                Console.WriteLine(v);


            var personList = new List<Person>
            {
               new Person { ID=1, Name= "jamie",Age= 33,Description= "",Depart="A"},
               new Person { ID=2, Name= "jamie2",Age= 32,Description= "",Depart="B"},
               new Person { ID=3, Name= "jamie3",Age= 31,Description= "",Depart="A"}
            };

            var personResult1 = personList.FindAll(person => person.Age <= 32).Select(person => person.Name);
            var personResult2 = from person in personList where person.Age <= 32 select person.Name;
            var personResult3 = personList.Where(person => person.Age <= 32).Select(person => person.Name.ToUpper());
            // order 
            var personResult4 = personList.FindAll(person => person.Age <= 32).OrderBy(person => person.Age).Select(person => person.Name);
            var personResult5 = from person in personList where person.Age <= 32 orderby person.Age descending select person.Name;
            var personResult6 = personList.Where(person => person.Age <= 32).OrderBy(person => person.Age).Select(person => person.Name.ToUpper());
            var personResult7 = personList.Where(person => person.Age <= 32).OrderByDescending(person => person.Age).Select(person => person.Name.ToUpper());
            //multi order
            var personResul8 = from person in personList orderby person.Age descending, person.ID select person;
            var personResul9 = personList.OrderByDescending(person => person.Age).OrderBy(person => person.ID).Select(person => person);
            Console.WriteLine("delay:");
            foreach (var v in personResult4)
                Console.WriteLine(v);

            foreach (var v in personResul9)
                Console.WriteLine(v.ID + " " + v.Name + " " + v.Age);

            //延迟查询

            personList.Add(new Person { ID = 4, Name = "jamie4", Age = 31, Description = "", Depart = "A" });
            personList.Add(new Person { ID = 5, Name = "jamie5", Age = 30, Description = "", Depart = "B" });
            personList.Add(new Person { ID = 6, Name = "jamie5", Age = 31, Description = "", Depart = "A" });
            personList.Add(new Person { ID = 7, Name = "jamie5", Age = 33, Description = "", Depart = "C" });
            Console.WriteLine("DeferredQuery:");
            foreach (var v in personResult6)
                Console.WriteLine(v);

            foreach (var v in personResul8)
                Console.WriteLine(v.ID + " " + v.Name + " " + v.Age);

            // 分组 

            var personResul10 = from person in personList group person by person.Depart into g orderby g.Count() descending where g.Count() > 1 select new { count = g.Count(), dep = g.Key };
            // 将年龄不大于33岁的职工进行分组,筛选出数量大于1的部门,并且按数量进行排序
            var personResul11 = from person in personList where person.Age <= 32 group person by person.Depart into g orderby g.Count() descending where g.Count() > 1 select new { count = g.Count(), dep = g.Key };
            Console.WriteLine("order group :");
            foreach (var v in personResul10)
                Console.WriteLine(v.dep + " " + v.count);
            Console.WriteLine("order group with condition:");
            foreach (var v in personResul11)
                Console.WriteLine(v.dep + " " + v.count);

            // 类型筛选

            object[] pList = new object[] { 1, "one", 2, "two", 3, "three" };
            var objcetResult = pList.OfType<int>();
            foreach (var oj in objcetResult)
            {
                Console.WriteLine(oj);
            }


            // join 

            var salaryList = new List<Salary>() {
            new Salary { ID = 1, SalaryPerMonth=1000 },
            new Salary { ID = 2, SalaryPerMonth = 1502 },
            new Salary { ID = 3, SalaryPerMonth = 1503 },
            new Salary { ID = 4, SalaryPerMonth = 1504 },
            new Salary { ID = 5, SalaryPerMonth = 1505 },
            new Salary { ID = 6, SalaryPerMonth = 1506 },
            new Salary { ID = 7, SalaryPerMonth = 1507 },
            };


            var salarResult = from person in personList join salary in salaryList on person.ID equals salary.ID orderby salary.SalaryPerMonth descending select new { ID = person.ID, Name = person.Name, Salary = salary.SalaryPerMonth };
           
            Console.WriteLine("join:");
            foreach (var sa in salarResult)
            {
                Console.WriteLine(sa.ID+" " + sa.Name+" "+sa.Salary);
            }
            personList.Add(new Person { ID = 8, Name = "jamie8", Age = 31, Description = "", Depart = "A" });
            salaryList.Add(new Salary { ID = 9, SalaryPerMonth = 15098 });
            salaryList.Add(new Salary { ID = 7, SalaryPerMonth = 15098 });
            Console.WriteLine("delay join:");

            foreach (var sa in salarResult)
            {
                Console.WriteLine(sa.ID + " " + sa.Name + " " + sa.Salary);
            }


            // zip 合并 Net4.0新增,可对两个相关的序列进行合并
            //返回值qZip为字符串集合 若合并两项项数不同,则在达到较小集合的末尾时停止
            // 只是单纯的 拿前边的第I个和后面的第I个进行合并,不会进行匹配处理,所有前提必须是相关序列。

            var zipReult = personList.Zip(salaryList, (fist, second) =>string.Format("ID:{0},Name:{1},ID:{2},Salary:{3}",fist.ID,fist.Name,second.ID,second.SalaryPerMonth));

            foreach (var zr in zipReult)
            {
                Console.WriteLine(zr);
            }

            // 分页 skip 和take 。skip跳过指定数量的元素,take提取固定长度元素 
            // Skip(1 * 5) 跳过第一页,每页放5个。

            var page2 = (from person in personList orderby person.Age descending select person).Skip(1 * 5).Take(5);
            var page2_2 = personList.OrderByDescending(person => person.Age).Select(person => person).Skip(1 * 5).Take(5);

            foreach (var person in page2)
            {
                Console.WriteLine(person.Name);
            }
            //并行linq
            //并行查询可以分解查询的工作,使其分布在多个线程上。当pc拥有多个cpu时,可以看到并行查询带来的改进效果。并行LINQ适用于大型的集合查询,并拥有一定的优势。使用
            // System.Collections.Concurrent.Partitioner.Create
            // 可以手动创建分区器。

            //构造大数组
            const int count = 100000000;
            var data = new int[count];
            var r = new Random();
            for (int i = 0; i < count; i++)
            {
                data[i] = r.Next(40);
            }
            Console.WriteLine("start...");
            var st = System.DateTime.Now;
            var sum = (from x in data where x > 20 select x).Sum();//常规linq-耗时1.8641s
            var st2 = System.DateTime.Now;
            var sum2 = (from x2 in data.AsParallel() where x2 > 20 select x2).Sum();//并行查询-耗时0.6620s

            //var sum3 = data.AsParallel().Where(x3 => x3 > 20).Sum();//或并行查询----x3 => x3 > 20(Lambda表达式)
            var st3 = System.DateTime.Now;

            /*Partitioner.Create
             手动创建分区器
             * Create具有多个重载,可依据需求进行分区
             */
            var sum4 = (from c in System.Collections.Concurrent.Partitioner.Create(data, true).AsParallel() where c > 20 select c).Sum();
            var st4 = System.DateTime.Now;
            var dt1 = st2 - st;
            var dt2 = st3 - st2;
            var dt3 = st4 - st3;
            Console.WriteLine("linq:{0}s", dt1.TotalSeconds.ToString());
            Console.WriteLine("Parallel linq:{0}s", dt2.TotalSeconds.ToString());
            Console.WriteLine("Create Parallel linq:{0}s", dt3.TotalSeconds.ToString());



            Console.ReadLine();

          


        }

        class Person
        {

            public int ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
            public string Description { get; set; }
            public string Depart { get; set; }
            public string SBU { get; set; }

        }
        class Salary
        {
            public int ID { get; set; }
            public double SalaryPerMonth { get; set; }
        }

    }
}

猜你喜欢

转载自blog.csdn.net/stu_20052369/article/details/88119194