Burak Karakuş
Burak Karakuş

Reputation: 1410

Multiple values for single key

I have a list that contains Categories and their accept/reject counts but there is a problem with this list. I'm using a LINQ query to access the data, and I grouped them by both category name and Accept/Reject Code(ResultCode). So the data is in this form:

enter image description here

Almost all of the Categories have both AP counts and RJ counts. And what I'm trying to do is to show each Category's accept and reject count. What should I use? Hashtables don't fit in this problem, I tried Dictionary with int List as value but couldn't add when the same key appeared.

UPDATE:

List<ModReportingDM.ReportObjects.AllCategories> allcats = new List<ModReportingDM.ReportObjects.AllCategories>();
Dictionary<string, ModReportingDM.ReportObjects.ResultCode> dict = new Dictionary<string, ModReportingDM.ReportObjects.ResultCode>();
ModReportingDM.ReportObjects.ResultCode x = new ModReportingDM.ReportObjects.ResultCode();
allcats = reportBLL.GetAllCats(model.ModId, model.ReportStartDate, model.ReportEndDate);
        if (allcats != null)
        {
            model.AllCatsList = new List<ModReportingDM.ReportObjects.AllCategories>();

            foreach (var item in allcats)
            {
                x.Accepted = item.Count;
                x.Rejected = item.Count;
                dict.Add(item.Category, x);

            }
        }

Query:

public List<AllCategories> GetAllCats(int modId, DateTime startDate, DateTime endDate)
    {
        using (entities = new ModReportingEntities())
        {
            var query = (from c in entities.Content
                         where c.ModId == modId && c.CreatedTime >= startDate && c.CreatedTime <= endDate && c.Category != null
                         group c by new { c.Category, c.ResultCode } into g
                         orderby g.Count() ascending
                         select new AllCategories
                         {
                             Category = g.Key.Category,
                             ResultCode = g.Key.ResultCode,
                             AcceptCount = g.Count(),
                             RejectCount = g.Count()
                         });

            return query.ToList();
        }
    }

Upvotes: 3

Views: 2101

Answers (3)

Burak Karakuş
Burak Karakuş

Reputation: 1410

My colleague and I realized that we can keep track of the Category's and if same Category occurs, it means that only a field of it should be changed(either AcceptCount or RejectCount). So we've created a lambda expression like this:

foreach(var item in allcats)
            {
                if (model.AllCategories.Select(m => m).Where(x => x.Category == item.Category).ToList().Count == 0) 
                {
                    if (item.ResultCode == "AP") {
                        model.AllCategories.Add(new ModReportingDM.ReportObjects.AllCategories()
                        {
                            Category = item.Category,
                            AcceptCount = item.Count
                        });
                    }
                    else
                    {
                        model.AllCategories.Add(new ModReportingDM.ReportObjects.AllCategories()
                        {
                            Category = item.Category,
                            RejectCount = item.Count
                        });
                    }
                }
                else 
                {
                    ModReportingDM.ReportObjects.AllCategories x = model.AllCategories.Select(n => n).Where(y => y.Category == item.Category).ToList().First();
                    if (item.ResultCode == "AP") 
                    {
                        x.AcceptCount = item.Count;
                    }
                    else 
                    { 
                        x.RejectCount = item.Count; 
                    }
               }   
            }

If same Category occurs, go ahead and change its AcceptCount or RejectCount accordingly. That's the way I solved the problem.

Upvotes: 0

Mahesh Malpani
Mahesh Malpani

Reputation: 1989

 List<Tuple<string, string, int>> listOfTuples = new List<Tuple<string, string, int>>();
            Tuple<string, string, int> tupleItem1 = new Tuple<string, string, int>("A", "AP", 1);
            listOfTuples.Add(tupleItem1);

You can use Tuple. Please refer http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx

Upvotes: 1

Yuval Itzchakov
Yuval Itzchakov

Reputation: 149528

What i would do is create a ResultCode class:

public class ResultCode
{
    public int Ap { get; set; }
    public int Rj { get; set; }
}

and then use a Dictionary<string, ResultCode> which maps each category to its report.

You could also take a different approach using a Tuple<T1, T2> (which personally i like less) which simply maps your key to two distinct values:

Dictionary<string, Tuple<int, int>> categoryToResultCode;

Upvotes: 4

Related Questions