分组和总和清单

时间:2015-12-05 00:31:06

标签: c# list linq sum linq-group

我在C#(RoomId,WallTypeId,WallTypeArea)中有原始列表,我需要先将它们分组,然后加上第三个。对于每个房间和墙壁类型我需要一个区域。 (每个房间有多少墙类型。)我想,可以通过几个foreach循环简单地完成。但是有很多房间,每个墙都分为大量的子面。 有没有人知道更高效的linq和/或IEnumerable方法来做到这一点?

这是我的班级和List<RawSurfaceData>

public class RawSurfaceData                 
{                   
    public ElementId RoomId;                    
    public ElementId WallTypeId;                    
    public double WallTypeArea;                 
}                   

RoomId  WallTypeId  WallTypeArea            
 101      WT01        10            
 101      WT01        10            
 101      WT01        10            
 101      WT03        10            
 102      WT01        10            
 102      WT01        10            
 102      WT03        10            
 102      WT03        10            

需要像这样:

 101      WT01        30            
 101      WT03        10            
 102      WT01        20            
 102      WT03        20            

我在这里研究后将一些代码放在一起,但它没有进行任何分组。

public IEnumerable<IGrouping<SortedSurfaceData,RawSurfaceData>> sortedSurfData0
{
    get;
    set;
}

public void GroupRawData(List<RawSurfaceData> rawData)
{
    sortedSurfData0 = (IEnumerable<IGrouping<SortedSurfaceData, RawSurfaceData>>)rawData.GroupBy(t => new SortedSurfaceData { roomSorted = t.RoomElement, elemTypeSorted = t.elemType, dblTypeAreaInRoom = rawData.Sum(a => t.dblArea) });
}

以下是另一种做同样事情的尝试。 它只返回一个元素(空间)并且不能正确求和。

public void SortRoomSurfData(List<RawSurfaceData> lstRawData)
{
    var query = (from t in lstRawData
                 group t by new { t.RoomElement, t.elemType }
                 into grp
                 select new
                 {
                     grp.Key.RoomElement,
                     grp.Key.elemType,
                     Quantity = grp.Sum(t => t.dblArea)
                 });
}

这里有一个简短的调试视频: http://screencast.com/t/5EuZi1OM1l

我在建筑模型中选择了两个元素(房间)。 软件API总共正确地返回19个表面(RawSurfaceData)。 但var query只返回一个房间。

1 个答案:

答案 0 :(得分:0)

Tnx jeroenh和miken的提示

这段代码对我有用。 似乎应该做它应该做的事情: - )

 1) Failure:
TestBlog#test_title_is_treehouse [test.rb:12]:
Expected: "Treehouse Blog"
  Actual: "yyy"