/ / ¿Cómo combino dos diccionarios en C # - c #, estructuras de datos

¿Cómo fusiono dos diccionarios en C # - c #, estructuras de datos?

Considere la siguiente situación ...

  • Un usuario pertenece a uno o más grupos.
  • El grupo tiene uno o muchos permisos
  • El permiso se define como id y un vector de booleanos (para lectura, escritura, etc.). El vector tiene una docena de elementos predefinidos.

Necesito obtener una lista agregada de usuariospermisos En pseudocódigo, obtengo todos los permisos del primer grupo al que pertenece el usuario; y luego para los grupos posteriores, agrego nuevos permisos, pero para los existentes necesito O todos los permisos en el vector. Es decir, si un grupo tiene permisos para leer y otro tiene permisos para escribir, el usuario tendrá permiso para leer y escribir.

La operación no es muy frecuente; Por lo tanto, el rendimiento no es una gran preocupación.

Estoy pensando en un Diccionario para el vector de permisos (equivalente en C # de una matriz asociativa. Teóricamente, puedo representarlo en una matriz normal, pero parece demasiado propenso a errores). Decir,

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

Entonces los permisos para un grupo es otro diccionario

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

(Esto viene de la base de datos; lo estoy mostrando aquí solo por claridad)

Y finalmente, los permisos de usuario serían una combinación inteligente de todos los permisos de grupo. Y aquí es donde siento que voy por la madriguera del conejo.

¿Hay algún tipo que sea más adecuado para esta tarea?

Respuestas

1 para la respuesta № 1

Consulta LINQ para combinar todos los permisos juntos:

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));