using System.Collections.Generic;
public char UserId { get; set; }
public char PermissionId { get; set; }
public List<char> UserIds { get; set; }
public List<char> PermissionIds { get; set; }
public override string ToString() => $"{string.Join(", ", UserIds)} | {string.Join(", ", PermissionIds)}";
public static void Main(string[] args)
HashSet<Mapping> mappings = new()
new() { UserId = 'A', PermissionId = 'X' },
new() { UserId = 'A', PermissionId = 'Y' },
new() { UserId = 'B', PermissionId = 'X' },
new() { UserId = 'B', PermissionId = 'Y' },
new() { UserId = 'B', PermissionId = 'Z' }
List<Row> rows = mappings
.GroupBy(m => m.PermissionId)
UserIds: gr.Select(m => m.UserId).ToArray() ))
.GroupBy(permissionForUsers => new string(permissionForUsers.UserIds),
( userIds, permissionsForUsers ) => new Row {
UserIds = userIds.ToList(),
PermissionIds = permissionsForUsers.Select(m => m.PermissionId).ToList() })
Console.WriteLine(string.Join(Environment.NewLine, rows));