public static partial class Log{[LoggerMessage(EventId = 0, Level = LogLevel.Critical, Message = "Could not open socket to `{hostName}`")]public static partial void CouldNotOpenSocket(ILogger logger, string hostName);}在前面的示例中 , 日志记录方法是 static , 并且在属性定义中指定了日志级别 。 在静态上下文中使用属性时 , ILogger 需要实例作为参数 。 您也可以选择在非静态上下文中使用该属性 。 有关更多示例和使用场景 , 请访问编译时日志记录源生成器文档 。
▌System.Linq — 可枚举的支持 Index 和 Range 参数
该 Enumerable.ElementAt 方法现在接受来自可枚举末尾的索引 , 如以下示例所示 。
Enumerable.Range(1, 10).ElementAt(^2); // returns 9
添加了一个 Enumerable.Take 接受 Range 参数的重载 。 它简化了对可枚举序列的切片:
- source.Take(..3)代替source.Take(3)
- source.Take(3..)代替source.Skip(3)
- source.Take(2..7)代替source.Take(7).Skip(2)
- source.Take(^3..)代替source.TakeLast(3)
- source.Take(..^3)代替source.SkipLast(3)
- source.Take(^7..^3)而不是.source.TakeLast(7).SkipLast(3)
感谢@dixin。
▌System.Linq —TryGetNonEnumeratedCount
该 TryGetNonEnumeratedCount 方法尝试在不强制枚举的情况下获取源可枚举的计数 。 这种方法在枚举之前预分配缓冲区很有用的场景中很有用 , 如下面的示例所示 。
List<T> buffer = source.TryGetNonEnumeratedCount(out int count) ? new List<T>(capacity: count) : new List<T>;foreach (T item in source){buffer.Add(item);}TryGetNonEnumeratedCount 检查实现 ICollection/ ICollection<T>或利用Linq 采用的一些内部优化的源 。
▌System.Linq — DistinctBy/ UnionBy/ IntersectBy/ExceptBy
新变体已添加到允许使用键选择器函数指定相等性的集合操作中 , 如下例所示 。
Enumerable.Range(1, 20).DistinctBy(x => x % 3); // {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); // { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40), ("Drew", 33) }
▌System.Linq - MaxBy/MinBy
MaxBy 和 MinBy 方法允许使用键选择器查找最大或最小元素 , 如下例所示 。
var people = new (string Name, int Age)[] { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40) };people.MaxBy(person => person.Age); // ("Ashley", 40)▌System.Linq —Chunk
Chunk可用于将可枚举的源分块为固定大小的切片 , 如下例所示 。
IEnumerable<int[]> chunks = Enumerable.Range(0, 10).Chunk(size: 3); // { {0,1,2}, {3,4,5}, {6,7,8}, {9} }归功于罗伯特安德森 。
▌System.Linq—— //FirstOrDefault 采用默认参数的重载LastOrDefaultSingleOrDefault
如果源可枚举为空 , 则现有的 FirstOrDefault /LastOrDefault /SingleOrDefault 方法返回 default(T) 。 添加了新的重载 , 它们接受在这种情况下返回的默认参数 , 如以下示例所示 。
Enumerable.Empty<int>.SingleOrDefault(-1); // returns -1感谢@ Foxtrek64。
▌System.Linq —Zip 接受三个可枚举的重载
Zip方法现在支持组合三个枚举 , 如以下示例所示 。
var xs = Enumerable.Range(1, 10);var ys = xs.Select(x => x.ToString);
var zs = xs.Select(x => x % 2 == 0);
foreach ((int x, string y, bool z) in Enumerable.Zip(xs,ys,zs))
{
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。