.NET 6 中的 LINQ 更新

Intro

在 .NET 6 中会针对 Linq 提供更好的支持,之前可能我们通过自定义扩展方法来实现的功能,现在官方直接支持了。Linq 将更加强大,更好地帮助我们简化应用程序代码。

Better Index & Range support

IndexRange 是在 C# 8.0 开始引入的一个特性,可以帮助我们更好地定位元素的位置或者在原有集合的基础上进行切片操作,.NET 6 会更好地支持 IndexRange 特性以及对 Linq 更好的支持,来看下面的示例:

Enumerable.Range(1, 10).ElementAt(^2).Dump(); // returns 9
Enumerable.Range(1, 10).Take(^2..).Dump(); // returns [9,10]
Enumerable.Range(1, 10).Take(..2).Dump(); // returns [1,2]
Enumerable.Range(1, 10).Take(2..4).Dump(); // returns [3,4]

XxxBy Clause

.NET 6 将引入 XxxBy 来支持按照集合内的元素来进行 Max/Min/Union/Distinct/Intersect/Except 等操作。

// DistinctBy/UnionBy/IntersectBy/ExceptBy
Enumerable.Range(1, 20).DistinctBy(x => x % 3).Dump(); // [1, 2, 3]
var first = new (string Name, int Age)[] { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40) };
var second = new (string Name, int Age)[] { ("Claire", 30), ("Pat", 30), ("Drew", 33) };
first.UnionBy(second, person => person.Age).Select(x=>$"{x.Name}, {x.Age}").Dump(); // { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40), ("Drew", 33) }// MaxBy/MinBy
var people = new (string Name, int Age)[] { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40) };
people.MaxBy(person => person.Age).Dump(); // ("Ashley", 40)
people.MinBy(x => x.Name).Dump(); // ("Ashley", 40)

Chuck

这个功能期待已久了,简单来说就是按 BatchSize 对一个集合进行分组,分组后每个小集合的元素数量最多是 BatchSize,之前我们自己写了一个扩展方法来实现,现在可以直接使用这个扩展方法了,来看下面的示例就能够明白了:

var list = Enumerable.Range(1, 10).ToList();
var chucks = list.Chunk(3);
chucks.Dump();// [[1,2,3],[4,5,6],[7,8,9],[10]]

Default enhancement

针对于 FirstOrDefault/LastOrDefault/SingleOrDefault 这几个扩展方法,之前的版本中我们是不能够指定默认值的,如果遇到 Default 的情况,会使用泛型类型的默认值,在 .NET 6 之后我们就可以指定一个默认值了,示例如下:

Enumerable.Empty<int>().FirstOrDefault(-1).Dump();
Enumerable.Empty<int>().SingleOrDefault(-1).Dump();
Enumerable.Empty<int>().LastOrDefault(-1).Dump();

Zip enhancement

var xs = Enumerable.Range(1, 5).ToArray();
var ys = xs.Select(x => x.ToString());
var zs = xs.Select(x => x % 2 == 0);foreach (var (x,y,z) in xs.Zip(ys, zs))
{$"{x},{y},{z}".Dump();
}

输出结果如下:

1,1,False
2,2,True
3,3,False
4,4,True
5,5,False

More

除了上面的更新之外,微软还提供了一个 TryGetNonEnumeratedCount(out int count) 方法来尝试获取 Count ,这样如果 IEnumerable<T> 是一个 ICollection 对象就能比较高效地获取 Count,而不用调用 Count() 扩展方法,不需要遍历 IEnumerable 对象

另外针对原来的 Min/Max 扩展方法,.NET 6 会增加一个重载,可以比较方便地指定一个比较器

public static TSource Min<TSource>(this IEnumerable<TSource> source, IComparer<TSource> comparer);
public static TSource Max<TSource>(this IEnumerable<TSource> source, IComparer<TSource> comparer);
public static TSource Min<TSource>(this IQueryable<TSource> source, IComparer<TSource> comparer);
public static TSource Max<TSource>(this IQueryable<TSource> source, IComparer<TSource> comparer);

References

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/net6sample/LinqSample/Program.cs

  • https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4/#system-linq-enhancements

  • .NET 6 Preview 4 Released

.NET 6 中的 LINQ 更新相关推荐

  1. 录像:在VS Orcas和ASP.NET中使用LINQ (第一部分)

    录像:在VS Orcas和ASP.NET中使用LINQ (第一部分) [原文地址] Video: Using LINQ with ASP.NET in VS "Orcas" (Pa ...

  2. 如何在Python Interpreter中重新导入更新的包? [重复]

    本文翻译自:How to re import an updated package while in Python Interpreter? [duplicate] This question alr ...

  3. C#在DataTable中使用LINQ

    LINQ 查询适用于实现的数据源 IEnumerable<T>接口或System.Query.IQueryable接口. DataTable类默认是没有实现以上接口的. 所以要在DataT ...

  4. CleanAOP实战系列--WPF中MVVM自动更新

    CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...

  5. android 异步刷新 方法,android应用中实现异步更新UI的方法有哪些

    android应用中实现异步更新UI的方法有哪些 发布时间:2020-12-07 17:12:00 来源:亿速云 阅读:144 作者:Leah android应用中实现异步更新UI的方法有哪些?相信很 ...

  6. 如何取消掉计算机更新图标,XP系统如何关闭右下角中的自动更新图标?

    相信大家在使用XP系统中,都有遇到过电脑右下角总是弹跳出"您的计算机可能存在风险"这是怎么回事呢?其实这是因为是系统关闭了系统自动更新,那么遇到这种问题该怎么解决呢?其实我们只要把 ...

  7. vue 父刷新子_父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法...

    场景: 我实际用到的是这样的,我父组件引用子组件related,父组件调用获取页面详情的方法,更新了state值related,子组件根据该related来渲染相关新闻内容,但是页面打开的时候总是先加 ...

  8. Fedora 21 中添加及更新源的命令

    原文: Fedora 21 中添加及更新源的命令 fedora的软件源信息文件(*.repo)都是放在 /etc/yum.repos.d 目录下的.可以通过# ls -l /etc/yum.repos ...

  9. 为什么子线程中不能直接更新UI

    点击上方"dotNET全栈开发","设为星标" 加"星标★",每天11.50,好文必达 全文约4000字,预计阅读时间8分钟 当初有同事就碰 ...

最新文章

  1. Oracle数据库进程
  2. PCL点云库用贪婪投影三角法网格化实现点云的表面重建
  3. 什么牌子的平板电脑好_平板电脑什么牌子好?带你一探年度最佳平板的奥秘
  4. 水泵调速c语言实验程序,C语言实验最原始.doc
  5. opencv实现图像目标对象区域挖掘
  6. VASSISTX在vs里面应用的快捷键
  7. 元气骑士里面的超级计算机,元气骑士兑换码2021可用
  8. android egl 代码,Android配置EGL环境
  9. 配置babel-plugin-import报错的深坑
  10. Android studio 设置背景图
  11. 结合NBA主题,Niantic再寻LBS AR游戏破局之道
  12. 在知乎上看到的一个关于Linux运维工程师必知的几点,希望对有志于从事运维工作的你有帮助
  13. pio读取 Excel中 电话号码和身份证的问题
  14. Linux命令行与shell脚本编程大全.第3版.pdf
  15. python读取灰度图_Python读取MRI并显示为灰度图像实例代码
  16. [优化精髓]搜索引擎优化应该重视什么?
  17. 怎么看计算机配件型号,笔记本屏幕型号怎么看_笔记本电脑屏幕型号的查看步骤-win7之家...
  18. 转载百度百科 python
  19. MySQL最新版本安装教程(Windows和Ubuntu)
  20. 【VSCode】Could not establish connection The VS Code Server failed to start的三种原因和三种解决方案

热门文章

  1. Linux下添加普通帐号
  2. 选择湿度传感器注意的若干问题
  3. 帆软报表(finereport)使用Event 事件对象 (target)修改提示框样式
  4. 【HDU - 2612】Find a way(bfs)
  5. MIME协议(三) -- MIME邮件的组织结构
  6. Python自动化之语法基础
  7. redis学习之三配置文件redis.conf 的含义
  8. 转帖不会乱码的,powershell网络蜘蛛
  9. linux内核的冒险md来源释义# 14raid5非条块读
  10. android studio no marked region found along edge Found along top edge