C# 刪除數(shù)組內(nèi)的某個(gè)值、一組值方法詳解
最近優(yōu)化了一個(gè)權(quán)限校驗(yàn)的功能,之前每次其他系統(tǒng)在獲取各自系統(tǒng)的權(quán)限配置時(shí),sso都去找到本地對(duì)應(yīng)的權(quán)限文件讀取解析一次。
這種設(shè)計(jì)雖然可以實(shí)現(xiàn)功能,但是這種反復(fù)去讀取的策略并不經(jīng)濟(jì),尤其在高并發(fā)的情況下更可能會(huì)成為性能瓶頸。
于是我對(duì)這塊業(yè)務(wù)進(jìn)行了優(yōu)化,而在優(yōu)化的過程中針對(duì)如何去除數(shù)組內(nèi)的某些參數(shù)試驗(yàn)了一些寫法,下面記錄我認(rèn)為比較優(yōu)雅的寫法。
首先講下場景,設(shè)計(jì)多系統(tǒng)的權(quán)限統(tǒng)一由sso控制,那么每次用戶登錄其他系統(tǒng)后需要向sso請(qǐng)求“用戶在該系統(tǒng)已有的權(quán)限”或“該用戶當(dāng)前是否擁有該功能的操作權(quán)限”。
那么sso需要在權(quán)限驗(yàn)證通過后再去獲取該用戶當(dāng)前的權(quán)限信息并返回,于是在權(quán)限校驗(yàn)的service中,我在構(gòu)造器里根據(jù)已有的系統(tǒng)類型先獲取一次對(duì)應(yīng)完整的權(quán)限樹,后面如果發(fā)現(xiàn)有缺失再嘗試讀取文件,不缺失則直接讀緩存配置。
已有的系統(tǒng)通過枚舉來記錄,假設(shè)定義如下:
public enum EnumSystemType { NoMenu = 0, // 不需要權(quán)限樹的系統(tǒng)或程序 App01 = 1, App02 = 2, ...... }
每個(gè)系統(tǒng)的權(quán)限配置保存在各自的文件中,例如App01完整的權(quán)限樹保存在App01.json中。
接著就是根據(jù)已有的系統(tǒng)去獲取每個(gè)文件的內(nèi)容并解析成權(quán)限樹緩存下來。而在獲取文件內(nèi)容時(shí),不需要獲取權(quán)限的枚舉(NoMenu)需要跳過找文件讀取的邏輯。這里我借助的是linq的功能來實(shí)現(xiàn)過濾該枚舉值的邏輯。
using System.Linq; private Dictionary<string, List<PermissionNode>> GetPermissions() { //todo foreach (var fileName in Enum.GetNames(typeof(EnumSystemType)) .Where(s => s != nameof(EnumSystemType.NoMenu)) .ToArray()) { //todo } //todo }
PS. Enum.GetNames的返回值是字符串?dāng)?shù)組。
單個(gè)參數(shù)的過濾通過where很容易就實(shí)現(xiàn)了,我突然想到一個(gè)問題,如何實(shí)現(xiàn)批量過濾一些枚舉值呢?
查了查資料,linq果然有解決方案,就是通過“Except”。
接著我還是以上面的例子來試驗(yàn),假如我希望構(gòu)造器讀取時(shí)跳過NoMenu和App01,可以這么寫:
using System.Linq; private Dictionary<string, List<PermissionNode>> GetPermissions() { //todo var exceptPermissions = new [] { nameof(EnumSystemType.NoMenu), nameof(EnumSystemType.App01), }; foreach (var fileName in Enum.GetNames(typeof(EnumSystemType)) .Except(exceptPermissions) .ToArray()) { //todo } //todo }
總結(jié):
1. 如何在一個(gè)數(shù)組中移除某個(gè)值的寫法:linq的where
2. 如何在一個(gè)數(shù)組中移除多個(gè)值的寫法:linq的except
C#如何刪除數(shù)組中的一個(gè)元素
C#如何刪除數(shù)組中的一個(gè)元素,剩余的元素組成新數(shù)組,數(shù)組名不變
double[] arr = new double[n];
需要?jiǎng)h除的是第m+1個(gè)數(shù)據(jù)arr[m]
求新數(shù)組arr.(新數(shù)組arr包含n-1個(gè)元素)
m,n數(shù)值已知
double[] arr = new double[50]; List<double> list = arr.ToList(); list.RemoveAt(5+1); double[] newarr = list.ToArray();
以上就是C# 刪除數(shù)組內(nèi)的某個(gè)值、一組值方法詳解的詳細(xì)內(nèi)容,更多關(guān)于C# 如何刪除數(shù)組內(nèi)的某個(gè)值、一組值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c# Form中的鍵盤響應(yīng)具體實(shí)現(xiàn)思路
在全屏Form中加上鍵盤ESC的響應(yīng),實(shí)現(xiàn)的效果就是:全屏中press鍵盤上的Escape鍵,程序結(jié)束,具體實(shí)現(xiàn)步驟如下,感興趣的朋友可以參考下哈2013-06-06C#12中的Primary?Constructors主構(gòu)造函數(shù)詳解
主構(gòu)造函數(shù)把參數(shù)添加到class與record的類聲明中就是主構(gòu)造函數(shù),這篇文章主要介紹了C#12中的Primary?Constructors 主構(gòu)造函數(shù),需要的朋友可以參考下2023-11-11在WPF中動(dòng)態(tài)加載XAML中的控件實(shí)例代碼
這篇文章主要介紹了在WPF中動(dòng)態(tài)加載XAML中的控件,實(shí)例分析了WPF中針對(duì)XAML中控件的動(dòng)態(tài)調(diào)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07c# in depth的泛型實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了c# in depth的泛型實(shí)現(xiàn)實(shí)例代碼,學(xué)C#的同學(xué)一定會(huì)用到泛型實(shí)現(xiàn)的,這里我們提供了泛型實(shí)現(xiàn)的程序代碼,大家參考使用2013-11-11c#之獲取本機(jī)主機(jī)名的四種方式總結(jié)
這篇文章主要介紹了c#之獲取本機(jī)主機(jī)名的四種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07