使用.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,一经查实,立即删除!

相关文章

Android之RecycleView实现指定范围的拖动效果

1 问题 在RecycleView里面实现指定位置的拖动效果,(这里是实现线性布局的,不是网格布局的) @Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {Log.i(TAG, "onMove viewHolder.getA…

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

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

异常何时去捕获

在业务逻辑层捕获异常。 工具类中不可处理异常&#xff0c;有异常要向外抛&#xff01;&#xff01;&#xff01;转载于:https://www.cnblogs.com/swbzmx/p/5643756.html

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;

Android之解决ScrollView嵌套RecycleView导致滑动冲突或者显示不全的问题

1 问题 ScrollView嵌套RecycleView导致滑动冲突或者显示不全的问题 2 解决办法 1&#xff09;、ScrollView替换成普通布局&#xff0c;然后RecycleView用的BaseMultiItemQuickAdapter多布局来写&#xff0c;也就是整个页面只有一个RecycleView&#xff0c;用来取代ScrollView…

MASA Auth - 权限设计

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

iOS js oc相互调用(JavaScriptCore)

http://blog.csdn.net/lwjok2007/article/details/47058795转载于:https://www.cnblogs.com/wlsxmhz/p/5645985.html

Android怎么自定义listview布局,Android ListView自定义布局

编辑&#xff1a;找一个 “开箱即用” 的帖子的末尾例子&#xff01;因为你看到多行受到影响我猜它有些事情要做系统如何回收资源&#xff0c;也许对Button的引用是不明确的。我不确定我在哪里选择了这种做法(Android教程或我们以前的开发人员通过这些教程学习了Android)。然而…

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

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

Android之点击图片底部出现灰色圆圈效果

1 需求 点击图片底部出现灰色圆圈效果 2 代码实现 1、num_oval_gray_def.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"androi…

【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…

集合转数组

akdfajf //集合转数组 // StringBuffer sql new StringBuffer(); // String[] arr new String[hjPztTalentInfos.size()]; // for (int i 0; i < hjPztTalentInfos.size(); i) { // arr[i] hjPztTalen…

Android之解决AppBarLayout 下面一道阴影

1 问题 AppBarLayout 下面写了其它布局&#xff0c;但是当这个布局滑动到上面时候&#xff0c;AppBarLayout 下面有一道阴影 2 解决办法 对AppBarLayout设置一个属性&#xff1a; app:elevation"0dp"

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

本文讲解利用南方方洲号无人船,该系统可用于水下地形地貌测绘、水库库容测量、水文勘测、疏浚检测、水环境监测等领域。 一、无人船水深测量 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 开始把它们…

Android之解决PC浏览器访问手机服务端取assets目录下的文件页面显示不出来问题

1 问题 我在手机里面写了Java socket服务,然后把前端的图片和css和js的文件放到了安卓项目的 assets目录,然后浏览器访问服务,我会把 assets目录下的文件读出来,然后用DataOutputStream流写入浏览器,但是发现页面显示不出来 2 分析原因 我的代码如下 public void sendHt…