分组和汇总列表



我在C#中有一个原始列表(RoomId、WallTypeId、WallType Area),我需要先将其二者分组,然后对第三者求和。对于每个房间和墙壁类型,我都需要一个区域。(每个房间有多少墙类型。)我想,只需几个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只返回一个房间。

提示的Tnx jeroeh和miken

这个代码对我有效。似乎做了它应该做的:-)

public List<SortedSurfaceData> SortRoomSurfData(List<RawSurfaceData> lstRawData)
        {
            var query = from rawData in lstRawData
    group rawData by new { rawData.idRoomElem, rawData.idElemType } into sortedData
                        select new SortedSurfaceData()
    {
        idRoomSorted = sortedData.Key.idRoomElem,
        idElemTypeSorted= sortedData.Key.idElemType,
        dblTypeArea= sortedData.Sum(x => x.dblInstArea),
    };
            List<SortedSurfaceData> sortedSurfaceData = query.ToList();
            return sortedSurfaceData;
        }

相关内容

  • 没有找到相关文章

最新更新