版权声明:本文为博主原创文章,未经博主允许不得转载。 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; }
}
}
}