Linq 小結


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; }
        }

    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章