Search code examples
c#listlinqdictionary

How do I use Linq to get multiple values from a list inside a dictionary


I've been trying for a bit but seem to be running into error after error, is there a way I can use Linq to compact this to make it more efficient, specifically the part where the dictionary list tries to detect if the list contains the intand returning it?

I'm sure its possible I just need a little help as I'm not so great with linq. If there's anything else you see I can do better I'd love to hear it. This is just some test code I've isolated for a bigger piece. Thanks in advance.

public enum columns { Parts_Column, Questions_Column, Answers_Column, Reset_Amount };
public static void Main()
{
    // Were are not comparing numbers this is just to fill the list out for count
    List<string> orderedRects = new List<string>() { "item1","item2","item3","item4","item5","item6","item7","item8","item9","item10" };

    Dictionary<columns, List<int>> TheDictionary = new Dictionary<columns, List<int>>();
    TheDictionary.Add(columns.Parts_Column, new List<int>() { 1 } );
    TheDictionary.Add(columns.Questions_Column, new List<int>() { 2, 4 } );
    TheDictionary.Add(columns.Answers_Column, new List<int>() { 3, 5 } );
    TheDictionary.Add(columns.Reset_Amount, new List<int>() { 6 } );
    
    int count = 0;
    int reset = TheDictionary[columns.Reset_Amount][0];
    for(int i = 0; i < orderedRects.Count;i++)
    {
        if(count == reset)
        {
            count = 0;
        }
        // Can we get this to become more compact using linq? or even combine them so each part has multiple int returns
        foreach (var pair in TheDictionary)
        {
            if(pair.Value.Contains(count))
            {
                int num = pair.Value.Where(o => o == count).FirstOrDefault();
                Console.WriteLine(pair.Key + ": " + num);
            }
        }
        count++;
    }
    Console.WriteLine("Total: " + count);
}

Solution

  • This gets what I was looking for thanks for the replies.

    public enum columns { Parts_Column, Questions_Column, Answers_Column, Reset_Amount };
        public static void Main()
        {
            // Were are not comparing numbers this is just to fill the list out
            List<string> orderedRects = new List<string>() { "item1","item2","item3","item4","item5","item6" };
            Dictionary<columns, List<int>> TheDictionary = new Dictionary<columns, List<int>>();
            TheDictionary.Add(columns.Parts_Column, new List<int>() { 1 } );
            TheDictionary.Add(columns.Questions_Column, new List<int>() { 2, 4 } );
            TheDictionary.Add(columns.Answers_Column, new List<int>() { 3, 5 } );
            TheDictionary.Add(columns.Reset_Amount, new List<int>() { 6 } );
            
            int count = 0;
            int reset = TheDictionary[columns.Reset_Amount][0];
            
            List<int> PartsColumnResults = new List<int>();
            List<int> QuestionsColumnResults = new List<int>();
            List<int> AnswersColumnResults = new List<int>();
            for(int i = 0; i < orderedRects.Count;i++)
            {
                if(count == reset)
                {
                    count = 0;
                }
                foreach (var pair in TheDictionary.Where(x => x.Value.Contains(count))) 
                {
                    // Parts Column
                    if(pair.Key.Equals(columns.Parts_Column)) { PartsColumnResults = TheDictionary[columns.Parts_Column]; }
                    // Questions Column
                    if(pair.Key.Equals(columns.Questions_Column)) { QuestionsColumnResults = TheDictionary[columns.Questions_Column]; }
                    // Answers Column
                    if(pair.Key.Equals(columns.Answers_Column)) { AnswersColumnResults = TheDictionary[columns.Answers_Column]; }
                }
                count++;
            }
            foreach(var r in QuestionsColumnResults)
            {
                 Console.WriteLine(r);
            }
        }