使用.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.pswp.cn/news/287119.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287119.shtml
英文地址,請注明出處:http://en.pswp.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…