原文:bit。ly32guqbn 作者:OlegKyrylchuk 翻译:精致码农王亮OrDefault方法的默认值 Enumerable。FirstOrDefault方法返回一个序列的第一个元素,如果没有找到,则返回一个默认值。在。NET6中,你可以覆盖该方法的默认值。同样,你还可以覆盖SingleOrDefault和LastOrDefault方法的默认值。Listintlist1new(){1,2,3};intitem1list1。FirstOrDefault(ii4,1);Console。WriteLine(item1);1Liststringlist2new(){Item1};stringitem2list2。SingleOrDefault(iiItem2,Notfound);Console。WriteLine(item2);Notfound新的By方法 。NET6引入了新的Enumerable。By方法,它的keySelector参数用来比较元素。这些新方法有:MinByMaxByDistinctByExceptByIntersectByUnionByListProductproductsnew(){new(){NameProduct1,Price100},new(){NameProduct2,Price5},new(){NameProduct3,Price50},};ProducttheCheapestProductproducts。MinBy(xx。Price);ProducttheMostExpensiveProductproducts。MaxBy(xx。Price);Console。WriteLine(theCheapestProduct);Output:Product{NameProduct2,Price5}Console。WriteLine(theMostExpensiveProduct);Output:Product{NameProduct1,Price100}recordProduct{publicstringName{}publicdecimalPrice{}}新的Chunk方法 如果你需要将一个序列的元素分割成块,在。NET6中你不必再自己实现了,它引入了一个新的Enumerable。Chunk扩展方法。IEnumerableintnumbersEnumerable。Range(1,505);IEnumerableint〔〕chunksnumbers。Chunk(100);foreach(int〔〕chunkinchunks){Console。WriteLine(34;{chunk。First()}。。。{chunk。Last()});}Output:1。。。100101。。。200201。。。300301。。。400401。。。500501。。。505三向Zip方法 Enumerable。Zip扩展方法可以将两个序列进行结合产生产生一个二元组序列。在。NET6中,它可以结合三个序列产生一个三元组序列。int〔〕numbers{1,2,3,4,};string〔〕months{Jan,Feb,Mar};string〔〕seasons{Winter,Winter,Spring};vartestnumbers。Zip(months)。Zip(seasons);foreach((int,string,string)zippedinnumbers。Zip(months,seasons)){Console。WriteLine(34;{zipped。Item1}{zipped。Item2}{zipped。Item3});}Output:1JanWinter2FebWinter3MarSpringElementAt方法支持Index 。NETCore3。0引入了Index结构体,它被C编译器用来支持一个新的前缀帽子运算符()。它表示从集合的末端开始的索引。在。NET6中,Enumerable。ElementAt方法支持Index。IEnumerableintnumbersnewint〔〕{1,2,3,4,5};intlastnumbers。ElementAt(0);Console。WriteLine(last);5Take方法支持Range 。NETCore3。0中也引入了Range结构体,它被C编译器用来支持一个范围操作符。。。。在。NET6中,Enumerable。Take方法也支持Range。IEnumerableintnumbersnewint〔〕{1,2,3,4,5};IEnumerableinttaken1numbers。Take(2。。4);foreach(intiintaken1)Console。WriteLine(i);Output:34IEnumerableinttaken2numbers。Take(。。3);foreach(intiintaken2)Console。WriteLine(i);Output:123IEnumerableinttaken3numbers。Take(3。。);foreach(intiintaken3)Console。WriteLine(i);Output:45用TryGetNonEnumeratedCount避免列举 。NET6引入了一个新的Enumerable。TryGetNonEnumerated方法,它试图确定一个序列中元素的数量,而不强制进行列举。它对IQueryable很有用,当调用Enumerable。Count时,你不希望执行整个查询。IEnumerableintnumbersGetNumbers();TryGetNonEnumeratedCount(numbers);Output:CouldnotgetacountofnumberswithoutenumeratingthesequenceIEnumerableintenumeratedNumbersnumbers。ToList();vartestenumeratedNumbers。ElementAt(1);TryGetNonEnumeratedCount(enumeratedNumbers);Output:Count:5voidTryGetNonEnumeratedCount(IEnumerableintnumbers){if(numbers。TryGetNonEnumeratedCount(outintcount))Console。WriteLine(34;Count:{count});elseConsole。WriteLine(Couldnotgetacountofnumberswithoutenumeratingthesequence);}IEnumerableintGetNumbers(){yieldreturn1;yieldreturn2;yieldreturn3;yieldreturn4;yieldreturn5;}结束语 所有的代码示例你都可以在我的GitHub上找到:https:github。comokyrylchukdotnet6featurestreemainLINQ20imrpovements