我在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
只返回一个房间。
答案 0 :(得分:0)
Tnx jeroenh和miken的提示
这段代码对我有用。 似乎应该做它应该做的事情: - )
1) Failure:
TestBlog#test_title_is_treehouse [test.rb:12]:
Expected: "Treehouse Blog"
Actual: "yyy"