Структура данных, которая будет содержать данные, индексированные по индексам строк и столбцов - PullRequest
5 голосов
/ 03 июня 2011

У меня есть список объектов для отображения пользователю.По сути, это набор прав пользователя.Я хочу отобразить таблицу с пользователями в виде столбцов, а действия - в виде строк.Тогда разрешение будет отображаться на пересечении между пользователем и действием.

Я ищу способ представления этих данных в структуре данных C #.Это позволило бы получить доступ с использованием user (string) и action (string), а также предоставить значение по умолчанию для каждой «ячейки».В идеале это было бы связано с Grid Control с автоматическим созданием столбцов.

Массив был бы хорош, но он допускал бы только целые числа в качестве индексов.Это также потребовало бы воссоздания и копирования массива при добавлении новой строки / столбца.

Я думал о создании объекта Dictionary<String, Dictionary<String, Permission>>, но он требует много проверок ошибок и плохо работает с элементами управления сеткой данных.

Существует ли существующий (открытый исходный код?) Проекттакая структура данных?По сути, это просто расширенная версия структуры «значение с двумя ключами».

Спасибо

1 Ответ

3 голосов
/ 05 июня 2011

Если вы хотите, чтобы структура данных была удобной для элементов управления сеткой с автоматической генерацией столбцов, тогда предпочтительной структурой данных будет DataTable.A DataTable подобен динамическому двумерному массиву данных, организованному по строкам и столбцам, и это именно то, что вам нужно.На самом деле столбцы индексируются строками, что также является тем, что вы хотите.Все, что нам нужно сделать, если найти способ обратиться к строкам DataTable по строке, и все будет готово!

Вот реализация PermissionMap, которая равна DataTable, чтобы вы могли использовать его с элементами управления сеткой, но также имеет некоторую инфраструктуру для поддержки индексации по двум строкам.Точный подход может варьироваться, но основная идея состоит в том, чтобы начать с DataTable, а затем добавить:

  • Конструктор, который предоставляет пользовательские действия
  • Метод AddUser длядобавьте новых пользователей и установите разрешения по умолчанию
  • A индексатор с двумя параметрами для получения и установки разрешений для пользователя и действия

Вот пример реализации:

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

И вот небольшая демонстрационная программа:

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

, которая производит этот вывод:

Action,Bill,Jane,
Read,Allow,Disallow,
Write,Disallow,Allow,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...