我有一个包含类别及其接受/拒绝计数的列表,但此列表存在问题。我使用LINQ查询来访问数据,并按类别名称和接受/拒绝代码(ResultCode)对它们进行分组。所以数据采用以下形式:
几乎所有类别都有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();
}
}
答案 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。这就是我解决问题的方式。