我在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;
}