just messing around, trying to expand my bag o’ tricks: I was just experimenting and want to do something like a Dictionary object with another inner Dictionary as the outside Dictionary’s .Value
var dictionary = new Dictionary<ObjectType, Dictionary<string, string>>();
ObjectType is an enum
so…what then…either you’re not suppose to do this or I just don’t know how ’cause I started running into a wall when I was trying to figure out how to populate and retrieve data from it.
Purpose might help: I’m being passed an ObjectGUID and need to flip through a bunch of database tables to determine which table the object exists in. The method I’ve already written just queries each table and returns count (here are a couple examples)
// 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;
So, that’s all done and works fine…but because the fieldname and table name are the only things that change for each check I started thinking about where I could re-use the repetitive code, I created a dictionary and a foreach loop that flips through and changes the sql line (shown below)…but, as you can see below, I need that ObjectType as kind of the key for each table/fieldname pair so I can return it without any further calculations
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 ?????
}
This isn’t all that important since my original method works just fine but I thought you StackOverflow geeks might turn me on to some new clever ideas to research…I’m guessing someone is going to smack me in the head and tell me to use arrays… 🙂
EDIT @ Jon Skeet ——————————————
Heh, sweet, think I might have come upon the right way to do it…haven’t run it yet but here’s an example I wrote for you
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;
}
}
This chunk should hit the domains table looking for domainguid and if count > 0 return ObjectType.Domain…look right? Only problem is, while it might seem somewhat clever, it’s like 2 dictionary objects, a couple strings, some nested loops, harder to read and debug than my first version, and about 10 more lines per check hehe…fun to experiment though and if this looks like to you then I guess it’s one more thing I can add to my brain 🙂
also found this how to fetch data from nested Dictionary in c#
You can definitely do it, although you’re currently missing a closing angle bracket and parentheses. It should be:
To add a given value you probably want something like:
If that doesn’t help, please show the code that you’ve tried and failed with – the database code in your question isn’t really relevant as far as I can tell, as it doesn’t try to use a nested dictionary.