Search code examples
c#winformsdictionaryextension-methodstrygetvalue

In a Dictionary TryGetValue, how do I write the out parameter (and get it's values) if it's part of a class?


Past question thread and link to fullpast code HERE

I create my dictionary with a class for a parameter so it can hold two string values. Now I'm trying to write a TryGetValue to out both of the strings in this class:

public class DictionaryInitializer
{
    public class DictionarySetup
    {
        public string theDescription { get; set; }
        public string theClass { get; set; }
    }

As you can see, there's theDescription and theClass nested in the DictionarySetup. Then I would create the dictionaries using that class here:

    public class DictionaryInit
    {
        //IS_Revenues data
        public Dictionary<int, DictionarySetup> accountRevenue = new Dictionary<int, DictionarySetup>()
            {
                { 400000, new DictionarySetup {theDescription="Call", theClass="Revenues"}}
            };
        public Dictionary<int, DictionarySetup> accountExpenses = new Dictionary<int, DictionarySetup>()
            {
                {790100, new DictionarySetup { theDescription="Currency Hedge", theClass="Other income/expense"}}
            };
    }

Then, my extension method where I plan to use my TryGetValue on the dictionary:

    public void DictionaryUseKey(int MapCode, int MapKey, int rowindex, Dictionary<int, DictionarySetup> AccountLexicon)
    {
        AccountLexicon[1] = new DictionarySetup();
        DictionarySetup Classes;
        DictionarySetup Descriptions;
        //Saw the above code in another thread, not sure if it's what I should be doing but it seems pretty close to what I want, however, I don't know how to specify the DictionarySetup.theDescription for example;
        AccountLexicon.TryGetValue(MapKey, out Classes);
        {
            //I want to be able to write theDescription and theClass into string variables for use below if the `TryGetValue` returns true, but it seems to me that it can only out one value? How does this work?
            DGVMain.Rows[rowindex].Cells[3].Value =  ?? how do I write something like...  theValues.theDescription;
            DGVMain.Rows[rowindex].Cells[11].Value = ?? how do I write something like...  theValues.theClass;
        }
    }

Lastly, I call the extension method in my event like so:

    private void btnMapper_Click(object sender, EventArgs e)
    {
        for (int rowindex = 0; rowindex < DGVMain.RowCount; rowindex++)
        {
            int accountKey = Convert.ToInt32(DGVMain.Rows[rowindex].Cells[2].Value);
            int projCode = Math.Abs(Convert.ToInt32(DGVMain.Rows[rowindex].Cells[7].Value));
            int deptCode = Math.Abs(Convert.ToInt32(DGVMain.Rows[rowindex].Cells[9].Value));
            int AbsoluteKey = Math.Abs(accountKey);
            while (AbsoluteKey >= 10) { AbsoluteKey /= 10; }
            while (deptCode >= 10) { deptCode /= 10; }
            theDictionary = new DictionaryInit();
            DictionaryUseKey(deptCode, accountKey, theDictionary.accountRevenue);
        }
    }

Solution

  • Actually the TryGetValue method will returns a boolean value represents the presence of the specified key, if the key is found, the corresponding value will be stored in the out parameter. Here in your case the out parameter is Classes and are defined in your code like this: DictionarySetup Classes. which means in case the key is present in the Dictionary means corresponding DictionarySetup object will be stored in the Classes so you can access the theDescription and theClass from Classes; Consider the code below:

     if(AccountLexicon.TryGetValue(MapKey, out Classes))
     {
        DGVMain.Rows[rowindex].Cells[3].Value =  Classes.theDescription;
        DGVMain.Rows[rowindex].Cells[11].Value = Classes.theClass;
     }