当前位置: 欣欣网 > 码农

.NET 9 Preview 1中的两个功能

2024-02-15码农

Json缩进

增加了Json输出时的缩进控制,代码如下:

using System.Text.Json;var options = new JsonSerializerOptions{//启用缩进 WriteIndented = true,//缩进字符 IndentCharacter = ' ',//缩进大小 IndentSize = 6, Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,};string json = JsonSerializer.Serialize(new { Name = "张三",Age=20,Sex="男" }, options );Console.WriteLine(json);

需要注意支持的缩进字符只有空格和水平制表符(tab键),其他字符会报错。下面是输出结果。

{"Name": "张三","Age": 20,"Sex": "男"}

JsonSerializerOptions原来提供了一个 JsonSerializerOptions. Defalut的配置同时提供了一个,现在又加了一个 JsonSerializerOptions.Web, 默认为驼峰命名策略。

var webJson = JsonSerializer.Serialize(new { UserName = "gsw", Password="123456" }, JsonSerializerOptions.Web // Defaults to camelCase naming policy. );Console.WriteLine(webJson);

结果:

{"userName":"gsw","password":"123456"}

Linq扩展方法CountBy和AggregateBy

CountBy,把key相同的进行相加,返回一个KeyValue集合。MaxBy和MinBy获取整个集合中最多和最少的KeyValue,如果有相同的,取第一个。

var sourceText = """Lorem ipsum dolor sit amet, consectetur adipiscing elit.Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices amet diam.""";Console.WriteLine(sourceText);var KVs = sourceText .Split(new char[] { ' ', '.', ',','\r','\n' }, StringSplitOptions.RemoveEmptyEntries) .Select(word => word.ToLowerInvariant()) .CountBy(word => word);foreach (var item in KVs){ Console.WriteLine(item.Key + ":" + item.Value);}Console.WriteLine("-------------------------");var mostFrequentWord = KVs.MaxBy(pair => pair.Value);Console.WriteLine(mostFrequentWord.Key + ":" + mostFrequentWord.Value);Console.WriteLine("-------------------------");mostFrequentWord = KVs.MinBy(pair => pair.Value);Console.WriteLine(mostFrequentWord.Key + ":" + mostFrequentWord.Value);

运行结果:

Loremipsum dolor sit amet, consectetur adipiscing elit.Sednon risus. Suspendisse lectus tortor, dignissim sit amet,adipiscingnec, ultricies sed, dolor. Cras elementum ultrices amet diam.lorem:1ipsum:1dolor:2sit:2amet:3consectetur:1adipiscing:2elit:1sed:2non:1risus:1suspendisse:1lectus:1tortor:1dignissim:1nec:1ultricies:1cras:1elementum:1ultrices:1diam:1-------------------------amet:3-------------------------lorem:1

AggregateBy是对KeyValue集合进行求和计算。

var orders = new Order[] {new Order("zs", 1,DateTime.Now),new Order("ls", 2,DateTime.Now),new Order("ww", 3,DateTime.Now),new Order("zs", 4,DateTime.Now),new Order("ls", 5,DateTime.Now),new Order("ww", 6,DateTime.Now), };var kvs = orders.AggregateBy( keySelector: word => word.OrderUser, seed: 0m,(orderAmount, order) => orderAmount + order.OrderAmount );foreach (var item in kvs){ Console.WriteLine(item.Key + ":" + item.Value);}record Order(string OrderUser, decimal OrderAmount, DateTime OrderTime);

运行结果:

zs:5ls:7ww:9