使用.Net分析.Net达人挑战赛参与情况

背景

C#是我2012年在大学课程中接触的,.NET Framework 我也一直使用至今。从2014年.NET 开源,2019年发布.NET Core 3 的时候,公司刚好有 Nvidia Jetson 平台 Linux 嵌入式设备的开发任务,.NET 又刚是适用于 Windows, Linux, 和 macOS 的跨平台解决方案。对于我个人来说也容易上手,就又开始了对其新的认识历程,按照微软的官方.NET 文档也做了几个练手的项目。

21年底的时候帮大学的老师开发了一个园林的信用评价系统,这个任务可以说是相当紧急了,前后端全部一个人完成,还只有元旦休息的这三四天的时间,虽然任务艰巨,算是个挑战,刚好那个时候在学完了.NET的《创建自己的第一个Web应用》,那就让挑战更猛烈些吧 —— 用.NET。其实也不是为了调整,学习一门语言更好的方式是跟着项目边学边写,硬着头皮爆肝午夜十二点,还好是按时完成了交付。

那个时候自己写的认证和授权的中间件还把Jwt认证实现了一遍。好吧,这就是没有老师带的后果吧。然后当我撸完项目闲下来,就在朋友圈看到杨中科老师发的.NET录播分享。真,真是及时雨啊。

31bede3b6e38f30d275f7d1653a07b8a.png

再然后收到杨老师的朋友圈邀请,我真的不是觊觎奖品里有杨老师还没发的.NET的新书。

就这样我参加了 《.NET 20周年学习挑战赛|寻找 .NET 技术达人》 ,并完成了三个模块的挑战。通过这三个挑战,系统性的对.NET的能力有了更全的了解。发现.NET 可以搞更多有意思的事情,通过Xamarin技术的初步认识,我玩起了在桌边因为疫情居家落灰的小米手表,最近在研究用Xamarin技术怎么通过蓝牙模拟HID设备控制电脑,做个腕间飞鼠。

回到挑战赛,挑战赛在5月21日结束,我就想问问举办方关于杨老师的书,啊,不,是奖品,您看我有机会嘛?

自己动手丰衣足食,自己抓取分析下排行榜不就完了嘛。

所需知识

基于我已经完成的代码,我整理了一下,完成这个小项目(一切皆项目)所需要的知识点。

首先我们需要获取到排行榜的数据,就可能需要用到爬虫技术,进行网页的抓取和分析,之后在分析网页请求的时候,我发现官方的排行榜数据是通过API获取到的,并且不需要鉴权,这可就太方便啦。我们稍微改一下参数就可以一次性拉取到排行数据了。

https://docs.microsoft.com/api/challenges/17c618cc-3c82-4a29-b2c6-d78b1de10b98/leaderboard?%24top=100&%24skip=0

F12打开网页调试,拿到对应挑战赛排行页面的如上API地址,将参数top改为100,skip改为0即可。

这样我们需要的其它技术或知识点如下:

•通过 HttpClient 使用 REST 服务•异步编程 async await 基本使用•使用 System.Text.Json 分析 Json 数据•LINQ 的基本方法

当然还有一些其它非必要,如匿名对象等。

实现思路

准备数据

先将拿到的三个挑战赛排名数据创建一个匿名的对象

// API 里有课程名,直接写出了为了好认
var apiInfo = new[]{(title:"C# 学习",url:"https://docs.microsoft.com/api/challenges/17c618cc-3c82-4a29-b2c6-d78b1de10b98/leaderboard?%24top=100&%24skip=0"),(title:"ASP.NET Core 开发",url:"https://docs.microsoft.com/api/challenges/b64cc891-e999-4652-909b-d545698a2e60/leaderboard?%24top=100&%24skip=0"),(title:".NET 移动应用",url:"https://docs.microsoft.com/api/challenges/38ec3c07-3ce6-4fb8-b423-b79166202364/leaderboard?%24top=100&%24skip=0")
};

设计存储数据的对象

创建一个存储挑战者学习信息的类,里面含有挑战者名称 userName ,完成挑战的数量 learnNum 和所完成的挑战 learnName ,以及一个添加新的完成挑战类目的方法 addClass

public class StudyInfo {public StudyInfo(string userName, int learnNum, List<string> learnName){this.userName = userName;this.learnNum = learnNum;this.learnName = learnName;}public string userName { get;private set; }public int learnNum { get; private set; }public List<string> learnName{ get; private set; }public void addClass(string className) {this.learnNum++;this.learnName.Add(className);}
}

排行榜数据获取

使用 HttpClient 获取挑战排行榜的数据

var client = new HttpClient();
foreach (var item in apiInfo)
{string jsoninfo = await client.GetStringAsync(item.url);// 分析
}

数据解析和输出

进行 json 数据的解析,通过具体返回的内容我们可以很容易的发现字段所代表的含义。

totalScoreUnits 表示本次挑战的小节数,只有完成这么多小节的学习才算完成了挑战,使用 var user = new List<StudyInfo>(); 来存储用户的挑战信息,根据解析的结果进行新建或者更新数据。最后将结果进行逆序排列输出到文件。

在 System.Text.Json 的使用上我们需要注意几点:

•获取的 json 的值时,我们需要进行强制数据转换,保存用户学习课程的 score 需要用 float 类型•遍历 json 数组时,需要先将其 JsonNode 对象进行 AsArray() 处理,JsonNode 是不支持 foreach 的•最后输出 json 序列化时,需要进行 options 的设置,这样才不会将中文字符进行编码

var options = new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) };
JsonNode jsonNode = JsonNode.Parse(jsoninfo)!;
// 合集总课程数
int classnum = (int)jsonNode["totalScoreUnits"]!;
foreach (var uinfo in jsonNode["results"]!.AsArray())
{// 学完的用户if ((float)uinfo["score"]! == classnum){// 看看有没有这个用户的信息var temp = user.FirstOrDefault(e => e.userName == (string)uinfo["userDisplayName"]!);if (temp is null){// 初始创建这个用户user.Add(new StudyInfo((string)uinfo["userDisplayName"]!, 1, new List<string>() { item.title }));}else{// 有,更新学习数据temp.addClass(item.title);}}
}
// 逆序排序后转为json字符存入文件
var jsonRes = JsonSerializer.Serialize(user.OrderByDescending(x => x.learnNum), options);
File.WriteAllText("output.json", jsonRes);

进行简单的分析

这里主要使用了 Linq 操作,如果对 Linq 不了解,可以去看一下杨老师的相关课程。

// 简单分析一下
Console.WriteLine($"完成《C# 学习》{user.Where(x=>x.learnName.IndexOf("C# 学习")>-1).Count()}人");
Console.WriteLine($"完成《ASP.NET Core 开发》{user.Where(x => x.learnName.IndexOf("ASP.NET Core 开发") > -1).Count()}人");
Console.WriteLine($"完成《.NET 移动应用》{user.Where(x => x.learnName.IndexOf(".NET 移动应用") > -1).Count()}人");
Console.WriteLine($"仅完成 1 次挑战 {user.Where(x => x.learnNum == 1).Count()}人");
Console.WriteLine($"仅完成 2 次挑战 {user.Where(x => x.learnNum ==2).Count()}人");
Console.WriteLine($"共完成 3 次挑战 {user.Where(x => x.learnNum == 3).Count()}人\n 分别是");foreach (var item in user.Where(x => x.learnNum == 3)) {Console.WriteLine(item.userName);
}

最后

详细的代码实现我放在 .Net 达人挑战赛参与分析 github[1] ,感兴趣的同学可以自取。

.NET 是一个免费的跨平台开源开发人员平台,希望 .NET 可以发展的越来越好。如果你希望可以更深入的了解一下 .NET ,强烈推荐去B站关注杨中科老师[2]去学习他的相关视频课程。你也可以关注“dotNet跨平台”公众号了解更多的.NET技术;.NET 学习和社区活动 可以关注:MSReactor 。

dotNet跨平台
MSReactor

References

[1] .Net 达人挑战赛参与分析 github: https://github.com/marin1993/.NetChallengesInfo.git
[2] B站关注杨中科老师: https://space.bilibili.com/27948784

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十分钟如何学会C语言?掌握规律举一反三考试提50分!

前言 上周写了一篇 20 分钟学会 C 语言与Python的文章——《一万字一篇文20分钟学会C语言和Python&#xff0c;十四年编程经验老鸟传授经验之道》&#xff0c;之后见粉丝转了一个话题“十分钟如何学会C语言”&#xff0c;我就在想是否能够十分钟呢&#xff1f;答案是可以的&am…

c语言在win8系统不兼容,Win8系统中存在不兼容软件如何解决?

最近有刚升级Win8系统的用户反映&#xff0c;FastStone Capture截图软件在Win7系统中可以兼容&#xff0c;正常打开&#xff0c;可是在Win8系统中就不能兼容了&#xff0c;这让用户非常烦恼。那么&#xff0c;Win8系统中存在不兼容软件如何解决呢&#xff1f;下面&#xff0c;我…

Python 3.6出现报错解决方案:No Python 3.6 installation was detected,无法卸载Python

卸载Python 3.6时错误提示&#xff0c;No Python 3.6 installation was detected。 解决办法是&#xff0c;先右键→更改→Repair。 然后再卸载&#xff0c;完成&#xff01;

MASA Auth - 权限设计

权限术语Subject&#xff1a;用户&#xff0c;用户组Action&#xff1a;对Object的操作&#xff0c;如增删改查等Object&#xff1a;权限作用的对象&#xff0c;也可以理解为资源Effect&#xff1a;规则的作用&#xff0c;如允许&#xff0c;拒绝Condition&#xff1a;生效条件…

【必懂】C语言水仙花数题解

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 前言 本专栏内容将会以轻松、简单的方式完成习题的解答&#xff0c;用…

【ArcGIS风暴】ArcGIS 10.8中计算体积的方法总结

ArcGIS 10.8提供了表面体积和面体积两种计算体积的方法。 一、表面体积 用途:用于计算表面和参考平面之间区域的面积和体积。 Situation 1:参考面以上 Situation 2:参考面以下 Python脚本: import arcpy from arcpy import envarcpy.CheckOutExtension("3D")…

.NET7:更细致的时间

当年在做go时&#xff0c;很羡慕它的时间有微秒&#xff0c;纳秒&#xff0c;在做性能优化时&#xff0c;能很小颗粒度的查看引入方法执行的时间&#xff0c;当时.net的DateTime只有毫秒&#xff08;虽然也有别的办法获取&#xff09;。现在&#xff0c;在最新的.NET7 Preview4…

案例:无人测量船水库水下地形测量及库容量计算

本文讲解利用南方方洲号无人船,该系统可用于水下地形地貌测绘、水库库容测量、水文勘测、疏浚检测、水环境监测等领域。 一、无人船水深测量 1、水岸线范围的获取 水岸线有助于布设航线,获取方式有两种: (1)无人船获取 对于

小米android系统耗电量大,小米手机耗电快的解决方法,亲测有效~

原标题&#xff1a;小米手机耗电快的解决方法&#xff0c;亲测有效~各位机友大家好&#xff0c;据小安观察&#xff0c;平台故障报修的小米手机用户还会蛮多的。那么今天就来讲讲小米手机的一些问题和解决方法&#xff0c;如果你感觉手机耗电较快&#xff0c;按照以下方式排查&…

【小白必懂】C语言最大、最小公约数题解

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 前言 本专栏内容将会以轻松、简单的方式完成习题的解答&#xff0c;用…

如何为微服务选择正确的消息队列

微服务及消息队列简史自从 Peter Rodgers 博士 2005 年在 Web Services Edge 会议上首次提出 Micro-Web-Services 一词后&#xff0c;IT 行业慢慢地从单体架构转向了微服务。2009 年&#xff0c;Netflix 决定把其单体架构拆分为微服务。2010 年&#xff0c;Best Buy 开始把它们…

【小白必懂】C语言回文数判断

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 情景再现 &#x1f478;小媛&#xff1a;小C&#xff0c;今天可以教我…

『技术群里聊些啥』查看 dotnet 源码,用它!用它!用它!

前言有网友在交流群中询问&#xff0c;怎么找到 System.Linq 源码的库&#xff1a;其实&#xff0c;我一直使用http://source.dot.net查看 dotnet 源码&#xff0c;这可是David Fowler&#xff08;微软 .NET 架构师&#xff09;也推荐的&#xff1a;功能演示那它到底有哪些功能…

(7)3分钟搞定 C# 逻辑运算

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

【经典回放】多种语言系列数据结构算法:二叉树(C#版)

实验任务描述 1 用C#语言完成二叉树的类、并构造出一个二叉树; 2 用递归方法完成二叉树的遍历; 3 泛型的二叉树遍历之一、用队列给出遍历结果 4 泛型的二叉树遍历之二、委托方式给出二叉树遍历结果 1 二叉树类的设计 同C语言一样,要构建一个二叉树,要用到类似struct的东西…

ThinkPHP讲解(十二)——文本编辑器和ajax传址

一、文本编辑器 1.首先&#xff0c;在网上下载ueditor文件 2.在要添加文本编辑器的页面中引用ueditor文件中的js文件 <script type"text/javascript" charset"utf-8" src"../ueditor/utf8-php/ueditor.config.js"></script> <scr…

(8)小白又如何?3分钟搞定一个 C# 知识点

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

华为鸿蒙vogtloop30pro价格,华为Mate30系列基本确认:首发麒麟985+鸿蒙系统,价格感人!...

原标题&#xff1a;华为Mate30系列基本确认&#xff1a;首发麒麟985鸿蒙系统&#xff0c;价格感人&#xff01;转眼间即将步入6月份&#xff0c;近期关于各大厂商下半年的新机消息也是多了起来&#xff0c;就拿华为下半年的高端旗舰华为Mate30系列来说&#xff0c;在各方媒体的…

(11)python里面while到底有多少知识点

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

【经典回放】多种语言系列数据结构算法:二叉树(JavaScript版)

1 二叉树类的设计以及二叉树遍历 要完成二叉树的类设计&#xff0c;最好把链表下的Node.js复制过来&#xff0c;相比链表的结点&#xff0c;二叉树仅仅是多了一个结点指针而已。略加修改后&#xff0c;就是&#xff1a; function TNODE(DATA) { this.DataDATA; this.lChildnu…