单个键的多个值

时间:2014-12-18 08:31:21

标签: c# .net linq list

我有一个包含类别及其接受/拒绝计数的列表,但此列表存在问题。我使用LINQ查询来访问数据,并按类别名称和接受/拒绝代码(ResultCode)对它们进行分组。所以数据采用以下形式:

enter image description here

几乎所有类别都有AP计数和RJ计数。而我想要做的就是展示每个类别的接受和拒绝计数。我该怎么用? Hashtables不适应这个问题,我尝试使用int List作为值,但是当相同的键出现时无法添加。

更新

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);

            }
        }

查询:

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();
        }
    }

3 个答案:

答案 0 :(得分:4)

我要做的是创建一个ResultCode类:

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

然后使用Dictionary<string, ResultCode>将每个类别映射到其报告。

您还可以使用Tuple<T1, T2>(我个人更不喜欢)采用不同的方法,只需将您的密钥映射到两个不同的值:

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

答案 1 :(得分:1)

 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);

你可以使用元组。请参阅http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx

答案 2 :(得分:0)

我的同事和我意识到我们可以跟踪类别,如果发生相同的类别,则意味着只应更改其中的一个字段(AcceptCount或RejectCount)。所以我们创建了一个像这样的lambda表达式:

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; 
                    }
               }   
            }

如果出现相同的类别,请继续并相应地更改其AcceptCount或RejectCount。这就是我解决问题的方式。