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