如何处理多列字典分组结果

时间:2013-11-27 00:09:52

标签: c# dictionary grouping

如果这是一个重复的问题,我很抱歉。如果重复,请告诉我在哪里可以找到它。

我发现很难理解分组的概念,特别是如何处理分组结果。任何人都可以解释我如何处理多列字典分组的结果。

我有

类型的字典
Dictionary<string, AsynchRunItem2> AsynchRunItems. 

string是我们使用其他4个属性生成的关键。

AsynchRunItem2具有以下属性:

string UniverseIDs;

DateTime StartDate;

DateTime EndDate;

在AsynchRunItems中,我得到了四条记录。请参阅下面的值。我离开了凯斯。

UniverseIDs:15 StartDate:10/9/2013 EndDate : 10/31/2013

UniverseIDs:20 StartDate:10/9/2013 EndDate : 10/31/2013

UniverseIDs:50,55 StartDate:09/30/2013 EndDate : 10/31/2013

UniverseIDs:60,64 StartDate:09/30/2013 EndDate : 10/31/2013

我想在StartDate和EndDate上对AsynchRunItems进行分组,这样我就可以使用Lambda而不是LINQ了。

UniverseIDs:15,20 StartDate:10/9/2013 EndDate : 10/31/2013

UniverseIDs:50,55,60,64 StartDate:09/30/2013 EndDate : 10/31/2013

我正如下面的分组,但想知道如何处理分组结果

var temp = AsynchRunItems.GroupBy(g => new { g.Value.StartDate,g.Value.EndDate});

我想知道如何前进并研究临时工,以便我能得到我想要的东西。

2 个答案:

答案 0 :(得分:0)

如果您只是想将结果显示为分组(当然可以使用当前的GroupBy()方法),请执行以下操作:

foreach(var t in temp)
{
    Console.WriteLine("UniverseIDs: {0} StartDate:{1} EndDate: {2}", string.Join(", ", t.ToList().Select (x => x.Value.UniverseIDs).ToArray()), t.Key.StartDate, t.Key.EndDate);
}

当我快速尝试复制样本值时,这给了我输出结果:

  

UniverseIDs:15,20 StartDate:10/9/2013 EndDate:   10/31/2013
  UniverseIDs:50,55,60,64 StartDate:9/30/2013   EndDate:10/31/2013

如果您对temp变量中包含的内容感到困惑,请参阅Tony的回答。

答案 1 :(得分:0)

GroupBy返回一组IGrouping对象,其中每个IGrouping对象都有一个Key属性,它本身也是一个集合 - 来自原始集合(AsynchRunItems)的项集合。因此,您可以看到GropyBy作为集合的集合返回,您可以执行诸如循环遍历IGrouping对象集合之类的操作,或循环遍历特定IGrouping对象中的项目。或者您可以使用Enumerable扩展函数来操作其中任何一个。

也许你对原始集合是一个字典的事实感到困惑。因为Dictionary是KevValuePair对象的集合,所以GroupBy方法返回的每个IGrouping对象都是相同类型的KeyValuePair对象的集合。如果你这样做可能会更容易理解:

            var groupedAsynchRunItems 
                = AsynchRunItems.GroupBy(kvp => kvp.Key)
                    .Select(g => g.ToDictionary(kvp => kvp.Key, kvp => kvp.Value));

这将返回一个集合,其中每个IGrouping都已转换为Dictionary。通过这样做,您将丢失IGrouping对象的Key属性。实际上,你应该这样做的唯一原因是你需要使用Dictionary类成员的功能。我只是建议它作为一种学习IGrouping如何工作的方式。我们甚至可以在这里做得更好:

var groupedAsynchRunItems
            = AsynchRunItems.GroupBy(kvp => kvp.Key)
                .ToDictionary(g => g.Key, g => g.ToDictionary(kvp => kvp.Key, kvp => kvp.Value));

它为您提供了一个词典词典,它可能有助于显示GroupBy方法的返回值如何类似于词典。