===========================================Racer.cs

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Collections;namespaceConsoleApplication4{[Serializable]publicclassRacer:IComparable<Racer>,IFormattable{publicstringFirstName{get;privateset;}//第一个武将publicstringLastName{get;privateset;}//第二个武将publicintWins{get;privateset;}//赢得次数publicstringCountry{get;privateset;}//国家publicintStarts{get;privateset;}//开始publicstring[]Arms{get;privateset;}//武器publicint[]Years{get;privateset;}//年份publicRacer(stringfirstname="",stringlasename="",intwins=0,stringcountry="",intstarts=0,IEnumerable<string>Arms=null,IEnumerable<int>years=null){this.FirstName=firstname;this.LastName=lasename;this.Wins=wins;this.Country=country;this.Starts=starts;List<string>LArms=newList<string>();foreach(variteminArms){LArms.Add(item);}this.Arms=LArms.ToArray();List<int>Lyears=newList<int>();foreach(variteminyears){Lyears.Add(item);}this.Years=Lyears.ToArray();}publicintCompareTo(Racerother){if(other==null)thrownewArgumentNullException("对象不能为空");returnthis.Wins.CompareTo(other.Wins);}publicstringToString(stringformat,IFormatProviderformatProvider){switch(format){case"":returnToString();case"C":StringBuildersb=newStringBuilder();foreach(variteminArms){sb.Append(item+",");}returnsb.ToString().TrimEnd(',');case"Y":StringBuildersb2=newStringBuilder();foreach(variteminYears){sb2.Append(item+",");}returnsb2.ToString().TrimEnd(',');default:returnToString();}}publicoverridestringToString(){returnstring.Format("第一个赛手:{0},最后一个赛手:{1},赢的次数:{2},国家:{3},开始:{4}",this.FirstName,this.LastName,this.Wins.ToString(),this.Country,this.Starts.ToString());}}}

===========================================Team.cs

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication4{[Serializable]publicclassTeam{publicstringName{get;privateset;}//团队名称publicint[]Years{get;privateset;}publicTeam(stringname,paramsint[]years){this.Name=name;this.Years=years;}}}

===========================================Formula.cs

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication4{publicstaticclassFormula{privatestaticList<Racer>racers;privatestaticList<Team>team;publicstaticIList<Racer>GetChampions(){if(racers==null){racers=newList<Racer>();racers.Add(newRacer("张飞","关羽",100,"蜀国",10,newstring[]{"丈八蛇矛","青龙偃月刀"},newint[]{200,201,202}));racers.Add(newRacer("张飞","关羽",99,"蜀国",10,newstring[]{"丈八蛇矛","青龙偃月刀"},newint[]{200,201,202}));racers.Add(newRacer("黄忠","魏延",80,"蜀国",10,newstring[]{"穿杨弓","大***"},newint[]{203}));racers.Add(newRacer("许褚","典韦",95,"魏国",10,newstring[]{"大铁锤","双戟"},newint[]{195,212}));racers.Add(newRacer("张辽","徐晃",90,"魏国",10,newstring[]{"长把子刀","长把子斧"},newint[]{205,106,215}));racers.Add(newRacer("程普","黄盖",96,"吴国",10,newstring[]{"龙虎鞭","大刀"},newint[]{190,191,202,207}));racers.Add(newRacer("周泰","太史慈",88,"吴国",10,newstring[]{"无敌身躯","火箭枪"},newint[]{195,196,197}));}returnracers;}publicstaticIList<Team>GetConstructorChampions(){if(team==null){team=newList<Team>();team.Add(newTeam("兄弟队",newint[]{200,201,202}));team.Add(newTeam("死党队",newint[]{203}));team.Add(newTeam("虎营队",newint[]{195,212}));team.Add(newTeam("良将队",newint[]{205,106,215}));team.Add(newTeam("老将队",newint[]{190,191,202,207}));team.Add(newTeam("不死队",newint[]{195,196,197}));}returnteam;}}}

===========================================Racer_IEqualityComparer.cs

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication4{publicclassRacer_IEqualityComparer:IEqualityComparer<Racer>{//只比较Racer对象的FirstName属性publicboolEquals(Racerx,Racery){returnx.FirstName==y.FirstName;}publicintGetHashCode(Racerobj){returnobj.FirstName.GetHashCode();}}}

===========================================主程序

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Collections;usingSystem.Collections.Concurrent;namespaceConsoleApplication4{classProgram{staticvoidMain(string[]args){//筛选(查询赢了至少95场的吴国和蜀国军队军队)***************************************************************//--Linqvarquery1=fromrinFormula.GetChampions()wherer.Wins>=95&&(r.Country=="吴国"||r.Country=="蜀国")selectr;//--扩展方法IEnumerable<Racer>ir1=Formula.GetChampions().Where(r=>r.Wins>=95&&(r.Country=="吴国"||r.Country=="蜀国")).Select(r=>r);Foreach(query1);Foreach(ir1);//索引筛选(查询赢了大于85场的、索引为偶数的军团)************************************************************//--扩展方法IEnumerable<Racer>ir2=Formula.GetChampions().Where((r,index)=>r.Wins>85&&index%2==0).Select(r=>r);Foreach(Formula.GetChampions());Foreach(ir2);//类型筛选**************************************************************************************************//--扩展方法object[]o=newobject[]{1,2,"张飞",2,"关二爷",true,1.1};IEnumerable<string>is1=o.OfType<string>();//筛选为string类型的元素Foreach(is1);//复合from子句(查询所有的武器)*******************************************************************************//--Linqvarquery2=fromrinFormula.GetChampions()fromcinr.Armsselectc;Foreach(query2);//--扩展方法IEnumerable<string>is2=Formula.GetChampions().SelectMany(r=>r.Arms,(r,a)=>new{Racer=r,Amrs=a}).Select(r=>r.Racer.FirstName+"|"+r.Racer.LastName+"=>"+r.Amrs);Foreach(is2);//排序(先按照第一个姓名降序排序,在按照赢得次数升序排序,返回10个数据)****************************************//--Linqvarquery3=(fromrinFormula.GetChampions()orderbyr.FirstNamedescending,r.Winsascendingselectr).Take(10);Foreach(query3);//--扩展方法IEnumerable<Racer>is3=Formula.GetChampions().OrderByDescending(r=>r.FirstName).ThenBy(r=>r.Wins).Select(r=>r);//第一种方法(ThenBy)IEnumerable<Racer>is4=Formula.GetChampions().OrderByDescending(r=>r.FirstName).CreateOrderedEnumerable(r=>r.Wins,Comparer<int>.Default,true).Select(r=>r).Take(10);//第二种方法(CreateOrderedEnumerable)Foreach(is4);//分组(根据国家分组,并且只显示军团大于或等于2的国家)************************************************************//--Linqvarquery4=fromrinFormula.GetChampions()grouprbyr.Countryintogwhereg.Count()>=2selectnew{Count=g.Count(),Key=g.Key};foreach(variteminquery4){Console.WriteLine("国家:{0}。军团数:{1}",item.Key,item.Count);}//--扩展方法varis5=Formula.GetChampions().GroupBy(r=>r.Country).Where(r=>r.Count()>=2).Select(r=>new{Count=r.Count(),Key=r.Key});foreach(variteminis5){Console.WriteLine("国家:{0}。军团数:{1}",item.Key,item.Count);}Console.WriteLine("================================================");//对嵌套的对象分组(对国家进行分组,查询出国家名称,国家的军团数,军队的将军)******************************//--Linqvarquery5=fromrinFormula.GetChampions()grouprbyr.Countryintogselectnew{Key=g.Key,Count=g.Count(),Name=fromningselectnew{LastName=n.LastName,FirstName=n.FirstName}};foreach(variteminquery5){Console.WriteLine("国家:{0}。军团数:{1}",item.Key,item.Count);foreach(varsubiteminitem.Name){Console.WriteLine("军队的将军:"+subitem.FirstName+"|"+subitem.LastName);}}Console.WriteLine("================================================");//--扩展方法varis6=Formula.GetChampions().GroupBy(r=>r.Country).Select(r=>new{Country=r.Key,Count=r.Count(),Name=r.Select(n=>new{FristName=n.FirstName,LastName=n.LastName})});foreach(variteminquery5){Console.WriteLine("国家:{0}。军团数:{1}",item.Key,item.Count);foreach(varsubiteminitem.Name){Console.WriteLine("军队的将军:"+subitem.FirstName+"|"+subitem.LastName);}}Console.WriteLine("================================================");//连接(查询年份大于195的军团和将军)******************************************************************************//--Linq【语法:fromrin第一个对象jointin第二个对象onr.oneequalst.oneselectnew{}】intmyyear=190;varquery7=fromracerinfromrinFormula.GetChampions()fromryinr.Yearswherery>myyearselectnew{Year=ry,Name=r.FirstName+"|"+r.LastName}jointeaminfromtinFormula.GetConstructorChampions()fromtyint.Yearswherety>myyearselectnew{Year=ty,Name=t.Name}onracer.Yearequalsteam.Yearselectnew{TeamName=team.Name,Year=team.Year,Name=racer.Name};foreach(variteminquery7){Console.WriteLine("军团:{0},将军:{1},年份:{2}",item.TeamName,item.Name,item.Year);}Console.WriteLine("================================================");//集合操作**********************************************************************************************************************//Racer_IEqualityComparer类实现了IEqualityComparer,只比较Racer对象的FirstName属性//委托,传一个武器名称,查询属于该武器的所有元素Func<string,IEnumerable<Racer>>myracer=racer=>fromrinFormula.GetChampions()fromainr.Armswherea==racerselectr;//----Distinct()排除重复的数据Foreach(Formula.GetChampions().Distinct(newRacer_IEqualityComparer()));//----Union()并集【(1,2,3,5)并集(5,6)=(1,2,3,5,6)】Foreach(myracer("长把子刀").Union(myracer("大***")));//----Intersect交集【(1,2,3,5)交集(5,6)=(5)】Foreach(Formula.GetChampions().Intersect(myracer("大***")));//----Except差集【(1,2,3,5)差集(5,6)=(1,2,3)】Foreach(Formula.GetChampions().Except(myracer("大***")));//合并*************************************************************************************************************************Foreach(myracer("长把子刀").Zip(myracer("大***"),(r,t)=>r.FirstName+"|"+t.FirstName));//输出:张辽|黄忠//分区【Skip:跳过指定数量的元素】【Take:显示的数量】*************************************************************************intpageindex=1;//当前页intpagesize=3;//每夜显示多少数据Foreach(Formula.GetChampions().Skip(pageindex*pagesize).Take(pagesize));//聚合操作符(返回一个值)******************************************************************************************************//----Count()返回集合中的项数Foreach(fromrinFormula.GetChampions()selectr.Years.Count());//----Sum()返回所有数字的和Console.WriteLine((fromrinFormula.GetChampions()selectr.Years.Count()).Sum());//----Min()返回集合中最小的元素Console.WriteLine((fromrinFormula.GetChampions()selectr.Years.Count()).Min());//----Max()返回集合中最小的元素Console.WriteLine((fromrinFormula.GetChampions()selectr.Years.Count()).Max());//----Average()返回集合的平均值Console.WriteLine((fromrinFormula.GetChampions()selectr.Years.Count()).Average());//----Aggregate()聚合运算Console.WriteLine((fromrinFormula.GetChampions()selectr.Years.Count()).Aggregate((a,b)=>a*b));//转换(根据将军查询武器)***********************************************************************************************//查询可以推迟到访问数据项时再执行,在迭代中使用查询时,查询会执行。而使用转换操作符会立即执行查询,把查询放在数组,列表或字典中varquery8=(fromrinFormula.GetChampions()selectnew{Name=r.FirstName,Racer=r}).ToList().ToLookup(r=>r.Name,r=>r.Racer);Foreach(query8["张飞"]);//在非类型化的集合上(如ArrayList)使用Linq查询,就可以使用cast()方法ArrayListabc=newArrayList();varaaaaa=(fromiiinabc.Cast<Racer>()selectii);//操作符*****************************************************************************************************************//--填充一个范围的数字Foreach(Enumerable.Range(1,20).Where(r=>r>10).Select(r=>r));//--返回一个空集合List<string>l=Enumerable.Empty<string>().ToList();//生成一个重复值的序列Foreach(Enumerable.Repeat("asd",3));Console.ReadKey();}staticvoidForeach<T>(IEnumerable<T>s){foreach(Titemins){Console.WriteLine(item);}//Parallel.ForEach(s,i=>Console.WriteLine(i));Console.WriteLine("=========================");}}}