包含由列和行字符串索引索引的数据的数据结构

Joh*_*ais 6 c# data-structures

我有一个要显示给用户的对象列表.基本上,它是用户的一组权限.我想显示一个表,其中用户为列,操作为行.然后,权限将显示在用户和操作之间的交集处.

我正在寻找一种在C#数据结构中表示这些数据的方法.它将允许使用用户(字符串)和操作(字符串)进行访问,并为每个"单元格"提供默认值.理想情况下,它将绑定到具有自动列创建的网格控件.

数组会很棒,但它只允许整数作为索引.当添加新的行/列时,还需要重新创建和复制数组.

我考虑过创建一个Dictionary<String, Dictionary<String, Permission>>对象,但它需要进行大量的错误检查,并且不能很好地处理数据网格控件.

是否存在针对该类数据结构的现有(开源?)项目?基本上,它只是"双键值"结构的增强版本.

谢谢

Ric*_*key 4

如果您想要一个对具有自动列生成功能的网格控件友好的数据结构,那么选择的数据结构是DataTable. ADataTable就像一个由行和列组织的动态二维数据数组,这正是您想要的。事实上,列是按字符串索引的,这也是您想要的。我们需要做的就是找到一种方法来寻址DataTableby 字符串的行,我们就万事大吉了!

这是 a 的一个实现PermissionMap,它a DataTable,因此您可以将它与网格控件一起使用,但它有一些基础结构来支持两个字符串的索引。确切的方法可能有所不同,但基本思想是以 a 开头DataTable,然后添加:

  • 提供用户操作的构造函数
  • AddUser添加新用户并设置默认权限的方法
  • 两个参数索引器,用于按用户和操作获取和设置权限

这是一个示例实现:

public enum Permission
{
    Default = 0,
    Disallow = 0,
    Allow = 1,
}

public class PermissionMap : DataTable
{
    private Dictionary<string, int> actionMap = new Dictionary<string, int>();

    public PermissionMap(IEnumerable<string> actions)
    {
        Columns.Add(new DataColumn("Action"));
        int i = 0;
        foreach (var action in actions)
        {
            actionMap.Add(action, i++);
            var row = NewRow();
            row["Action"] = action;
            Rows.Add(row);
        }
    }

    public void AddUser(string user)
    {
        Columns.Add(new DataColumn(user));
        foreach (DataRow row in Rows)
            row[user] = Permission.Default;
    }

    public Permission this[string user, string action]
    {
        get { return (Permission)Rows[actionMap[action]][user]; }
        set { Rows[actionMap[action]][user] = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个小演示程序:

class Program
{
    static void Main(string[] args)
    {
        var permissionMap = new PermissionMap(new[] { "Read", "Write" });
        permissionMap.AddUser("Bill");
        permissionMap.AddUser("Jane");
        permissionMap["Bill", "Read"] = Permission.Allow;
        permissionMap["Jane", "Write"] = Permission.Allow;
        foreach (DataColumn column in permissionMap.Columns)
        {
            Console.Write(column.ColumnName);
            Console.Write(",");
        }
        Console.WriteLine();
        foreach (DataRow row in permissionMap.Rows)
        {
            foreach (DataColumn column in permissionMap.Columns)
            {
                Console.Write(row[column]);
                Console.Write(",");
            }
            Console.WriteLine();
        }
        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

Action,Bill,Jane,
Read,Allow,Disallow,
Write,Disallow,Allow,
Run Code Online (Sandbox Code Playgroud)