1. 程式人生 > 程式設計 >C# 刪除陣列內的某個值、一組值方法詳解

C# 刪除陣列內的某個值、一組值方法詳解

最近優化了一個許可權校驗的功能,之前每次其他系統在獲取各自系統的許可權配置時,sso都去找到本地對應的許可權檔案讀取解析一次。

這種設計雖然可以實現功能,但是這種反覆去讀取的策略並不經濟,尤其在高併發的情況下更可能會成為效能瓶頸。

於是我對這塊業務進行了優化,而在優化的過程中針對如何去除陣列內的某些引數試驗了一些寫法,下面記錄我認為比較優雅的寫法。

首先講下場景,設計多系統的許可權統一由sso控制,那麼每次使用者登入其他系統後需要向sso請求“使用者在該系統已有的許可權”或“該使用者當前是否擁有該功能的操作許可權”。

那麼sso需要在許可權驗證通過後再去獲取該使用者當前的許可權資訊並返回,於是在許可權校驗的service中,我在構造器里根據已有的系統型別先獲取一次對應完整的許可權樹,後面如果發現有缺失再嘗試讀取檔案,不缺失則直接讀快取配置。

已有的系統通過列舉來記錄,假設定義如下:

public enum EnumSystemType
{
  NoMenu = 0,// 不需要許可權樹的系統或程式
  App01 = 1,App02 = 2,......
}

每個系統的許可權配置儲存在各自的檔案中,例如App01完整的許可權樹儲存在App01.json中。

接著就是根據已有的系統去獲取每個檔案的內容並解析成許可權樹快取下來。而在獲取檔案內容時,不需要獲取許可權的列舉(NoMenu)需要跳過找檔案讀取的邏輯。這裡我藉助的是linq的功能來實現過濾該列舉值的邏輯。

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的返回值是字串陣列。

單個引數的過濾通過where很容易就實現了,我突然想到一個問題,如何實現批量過濾一些列舉值呢?

查了查資料,linq果然有解決方案,就是通過“Except”。

接著我還是以上面的例子來試驗,假如我希望構造器讀取時跳過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
}

總結:

1. 如何在一個數組中移除某個值的寫法:linq的where

2. 如何在一個數組中移除多個值的寫法:linq的except

C#如何刪除陣列中的一個元素

C#如何刪除陣列中的一個元素,剩餘的元素組成新陣列,陣列名不變

double[] arr = new double[n];

需要刪除的是第m+1個數據arr[m]

求新陣列arr.(新陣列arr包含n-1個元素)

m,n數值已知

double[] arr = new double[50];
List<double> list = arr.ToList();
list.RemoveAt(5+1);
double[] newarr = list.ToArray();

以上就是C# 刪除陣列內的某個值、一組值方法詳解的詳細內容,更多關於C# 如何刪除陣列內的某個值、一組值的資料請關注我們其它相關文章!