Вложенные словарные объекты? - PullRequest
0 голосов
/ 10 февраля 2011

просто бездельничаю, пытаясь расширить мою сумку. Уловки: я просто экспериментировал и хочу сделать что-то вроде объекта Dictionary с другим внутренним словарем в качестве внешнего словаря .Value

var dictionary = new Dictionary<ObjectType, Dictionary<string, string>>();

ObjectType является перечислением

так ... что тогда ... либо вы не должны этого делать, либо я просто не знаю как, потому что я начал врезаться в стену, когда пытался выяснить, как заполнять и получать данные из него.

Цель может помочь: мне передают ObjectGUID, и мне нужно пролистать кучу таблиц базы данных, чтобы определить, в какой таблице существует объект. Метод, который я уже написал, просто запрашивает каждую таблицу и возвращает количество (здесь пара примеров)

            // Domain Check
        sql = string.Format(@"select count(domainguid) from domains where domainguid = ?ObjectGUID");
        count = (int)MySQLHelper.ExecuteScalar(ConnectionStrings.ConnectionStrings.V4DB_READ, sql, pObjectGUID).ToString().Parse<int>();
        if (count > 0)
            return ObjectType.Domain;

        // Group Check
        sql = string.Format(@"select count(domaingroupguid) from domaingroups where domaingroupguid = ?ObjectGUID");
        count = (int)MySQLHelper.ExecuteScalar(ConnectionStrings.ConnectionStrings.V4DB_READ, sql, pObjectGUID).ToString().Parse<int>();
        if (count > 0)
            return ObjectType.Group;

Итак, все сделано и работает нормально ... но поскольку имя поля и имя таблицы - это единственные вещи, которые меняются при каждой проверке, я начал думать о том, где можно повторно использовать повторяющийся код, я создал словарь и Цикл foreach, который переворачивает и изменяет строку sql (показано ниже) ... но, как вы можете видеть ниже, мне нужен этот ObjectType как вид ключа для каждой пары таблица / имя поля, чтобы я мог вернуть его без каких-либо дальнейших вычислений

Dictionary<string, string> objects = new Dictionary<string,string>();
            objects.Add("domains", "domainguid");
            objects.Add("domaingroups", "domaingroupguid");
            objects.Add("users", "userguid");
            objects.Add("channels", "channelguid");
            objects.Add("categorylists", "categorylistguid");
            objects.Add("inboundschemas", "inboundschemaguid");
            objects.Add("catalogs", "catalogguid");

            foreach (var item in objects)
            {
                sql = string.Format(@"select count({0}) from {1} where {0} = ?ObjectGUID", item.Value, item.Key);
                count = (int)MySQLHelper.ExecuteScalar(ConnectionStrings.ConnectionStrings.V4DB_READ, sql, pObjectGUID).ToString().Parse<int>();
                if (count > 0)
 return ?????
                }

Это не так уж важно, так как мой оригинальный метод работает просто отлично, но я подумал, что вы, фанаты StackOverflow, можете включить меня в некоторые новые умные идеи для исследования ... Я предполагаю, что кто-то собирается ударить меня по голове и скажи мне использовать массивы ...:)

РЕДАКТИРОВАТЬ @ Jon Skeet ------------------------------------------

Хе, сладкий, думаю, я мог бы найти правильный способ сделать это ... еще не запускал, но вот пример, который я написал для вас

var objectTypes = new Dictionary<string, string>();
        objectTypes.Add("domainguid", "domains");
        var dictionary = new Dictionary<ObjectType, Dictionary<string, string>>();
        dictionary.Add(ObjectType.Domain, objectTypes);

        foreach(var objectType in dictionary)
        {
            foreach(var item in objectType.Value)
            {
                sql = string.Format(@"select count({0}) from {1} where {0} = ?ObjectGUID", item.Key, item.Value);
                count = (int)MySQLHelper.ExecuteScalar(ConnectionStrings.ConnectionStrings.V4DB_READ, sql, pObjectGUID).ToString().Parse<int>();
                if (count > 0)
                    return objectType.Key;
            }
        }

Этот кусок должен попасть в таблицу доменов в поисках domainguid, а если count> 0, вернуть ObjectType.Domain ... выглядеть правильно? Единственная проблема, хотя это может показаться несколько умным, это как 2 словарных объекта, пара строк, несколько вложенных циклов, труднее читать и отлаживать, чем моя первая версия, и примерно на 10 строк на проверку хе-хе ... интересно экспериментировать, хотя и если это похоже на вас, то, думаю, это еще одна вещь, которую я могу добавить в свой мозг:)


также нашел это как извлечь данные из вложенного словаря в c #

1 Ответ

4 голосов
/ 10 февраля 2011

Вы определенно можете это сделать, хотя в настоящее время вам не хватает закрывающей угловой скобки и скобок. Должно быть:

var dictionary = new Dictionary<ObjectType, Dictionary<string, string>>().

Чтобы добавить заданное значение, вы, вероятно, захотите что-то вроде:

private void AddEntry(ObjectType type, string key, string value)
{
    Dictionary<string, string> tmp;
    // Assume "dictionary" is the field
    if (!dictionary.TryGetValue(type, out tmp))
    {
        tmp = new Dictionary<string, string>();
        dictionary[type] = tmp;
    }
    tmp.Add(key, value);
}

Если это не поможет, пожалуйста, покажите код, с которым вы пробовали и не смогли - код базы данных в вашем вопросе, насколько я могу судить, на самом деле не имеет значения, так как он не пытается использовать Вложенный словарь.

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