2017-07-03 107 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