2017-07-03 104 views
-1

考慮下列情形......我如何合併兩個字典在C#

  • 用戶屬於一個或多個組
  • 集團擁有一個或多個權限
  • 權限被定義爲ID和布爾值的矢量(用於讀取,寫入等)。該矢量是大約一打預定義的元素

我需要獲得用戶權限的聚合列表。在僞代碼中,我獲得了用戶所屬第一組的所有權限;然後爲後面的組添加新的權限,但對於現有的權限,我需要OR向量中的所有權限。也就是說,如果一個組具有讀取權限,另一個組具有寫入權限 - 則用戶將有權讀取寫入。

操作不是很頻繁;所以表現不是一個大問題。

我正在考慮爲權限向量的字典(C#等效於關聯數組。理論上,我可以用普通數組來表示它,但它感覺太容易出錯)。再說了,

var permVector = new Dictionary<string, bool> { 
    {"read", true}, {"delete", false} ... 
} 

然後一組的權限是另一種解釋

var groupPermissions = new Dictionary<int, Dictionary<string, bool>> { 
    { 1, permVector }... 
} 

(這來自於數據庫;我在這裏展示只是爲了清楚起見,這種方式)

最後,用戶權限將是所有組權限的智能合併。而這正是我感覺我要去兔子洞的地方。

是否有更適合此任務的任何類型?

+1

如果你創建自己的數據結構,那麼你就可以控制添加,合併等自己。但無論如何,你將不得不編寫它的代碼。 LINQ總是一個不錯的選擇 –

+0

在這裏有關於字典合併的具體問題嗎?似乎比這更一般。 第一個建議是使用枚舉而不是字符串作爲權限。可能與基於相互重疊的事物的升序值或[Flags]枚舉相關,因此您可以像提及的那樣將它們組合在一起。其次,同意@CallumLinington你應該強烈地考慮編寫自己的類來管理它們,然後你可以修改內部實現(並且詢問關於它的問題:) – stames

+0

第一個權限可以用一個整數來完成(比如unix )你有系統(讀,寫,執行),組(讀,寫,執行),用戶(讀,寫,執行),所以權限可以是9位整數。然後你有一本字典應該包含一個列表,不像字典>,其中鍵是組名,值是用戶名,或者鍵是用戶名,值是組名。 – jdweng

回答

1

LINQ查詢到所有的權限融合在一起:

var userPermissions = 
    groupPermissions 
     .SelectMany(pv => pv.Value) //Select all the Dictionaries 
     .GroupBy(pv => pv.Key) //Get each permission into its own group 
     .ToDictionary(g => g.Key, //Create the result 
      g => g.Any(permission => permission.Value)); 
+0

謝謝。不知道爲什麼我的問題是downvoted - 但我想,得到一個簡單明瞭的答案,從誰瞭解它就好了很值得! – Felix