LINQ多组由,如何填写字典?

时间:2014-09-24 10:05:34

标签: c# linq dictionary

我正在尝试从RavenDB中检索数据集,将其按几个类别分组,然后将每个组存储在字典中。检索和分组已经解决。但是,我仍然坚持如何将组合组(4个变量组)放入字典中。换句话说:字典需要填充每个不同的名称/年/月/日组合。我需要这个以后在图表中显示它 - 该部分已经被覆盖。

Dictionary<string, int> chartInformation = new Dictionary<string, int>();
List<string> xAxisCategories = new List<string>();

if (model.Period.Value == Timespan.Day)
{
    var groupedRecords = transformedRecords.GroupBy(x => new
    {
        x.Name, 
        x.DateTo.Value.Year, 
        x.DateTo.Value.Month, 
        x.DateTo.Value.Day
    });

    foreach (var recordGroup in groupedRecords)
    {

        if (!chartInformation.ContainsKey(recordGroup.Key.Name, 
            recordGroup.Key.Year, recordGroup.Key.Month, recordGroup.Key.Day)) 
        // how to do this properly 
        {
            chartInformation.Add(recordGroup.Key.?, 0);
        }

        if (!xAxisCategories.Contains(recordGroup.Key.?))
        {
            xAxisCategories.Add(recordGroup.Key.?);
        }

        foreach (var record in recordGroup)
        {
            //filling stuff here
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您需要将组密钥投影到如下字符串:

var groupedRecords = transformedRecords.GroupBy(x => String.Format("{0}-{1}-{2}-{3}",
    x.Name, 
    x.DateTo.Value.Year, 
    x.DateTo.Value.Month, 
    x.DateTo.Value.Day));

然后,您可以遍历组并检查字典中是否存在某个键:

foreach(var group in groupedRecords)
{
    if(!chartInformation.ContainsKey(group.Key))
    {
        chartInformation.Add(group.Key, 0)
    }
}

但请注意,如上所示将您的密钥投影到字符串可能会导致冲突,即属于不同组的行可能会在同一组中结束。

希望这有帮助。