【发布时间】:2015-12-05 00:31:05
【问题描述】:
我在 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只返回一个房间。
【问题讨论】:
-
抱歉,这是 C#。我整理了一些代码,但不确定它的作用。我确实在“sortedSurfData0”上得到了一些结构,但不是我想要做的。 SortedSurfaceData 和 RawSurfaceData 这两个类的区域基本相同,只需要分组和求和。 public void GroupRawData(List
rawData) { sortedSurfData0 = (IEnumerable >)rawData.GroupBy(t => new SortedSurfaceData { roomSorted = t.RoomElement, elemTypeSorted = t.elemType, dblTypeAreaInRoom = rawData。 Sum(a => t.dblArea) }); } -
您的方法
SortRoomSurfData中的查询看起来是正确的(除了它没有做任何事情) -
Tnx jeroenh 这行得通: public List
SortRoomSurfData(List lstRawData) { var query = from rawData in lstRawData group rawData by new { rawData.idRoomElem, rawData.idElemType } into sortedData select新的 SortedSurfaceData() { idRoomSorted = sortedData.Key.idRoomElem, idElemTypeSorted= sortedData.Key.idElemType, dblTypeArea= sortedData.Sum(x => x.dblInstArea), }; List sortedSurfaceData = query.ToList();返回排序的表面数据; }
标签: c# list linq sum linq-group