1
我在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
只返回一個房間。
對不起miken這是C#。 我把一些代碼放在一起,但不知道它做了什麼。 我確實在「sortedSurfData0」上獲得了一些結構,但沒有達到我的目的。兩個類SortedSurfaceData和RawSurfaceData區域基本相同,只需要進行分組和求和即可。 公共無效GroupRawData(列表 RAWDATA) { sortedSurfData0 =(IEnumerable的>)rawData.GroupBy(T =>新SortedSurfaceData {roomSorted = t.RoomElement,elemTypeSorted = t.elemType, dblTypeAreaInRoom = rawData.Sum(a => t.dblArea)}); } –
在你的方法查詢'SortRoomSurfData'看起來是正確的(除了它沒有做任何事情) – jeroenh
TNX jeroenh 這工作: 公開名單 SortRoomSurfData(名單 lstRawData) {VAR 查詢=從RAWDATA在lstRawData RAWDATA組通過新的{rawData.idRoomElem,rawData.idElemType}入sortedData 選擇新SortedSurfaceData() { idRoomSorted = sortedData.Key.idRoomElem, idElemTypeSorted = sortedData.Key.idElemType, dblTypeArea = sortedData.Sum(x => x.dblInstArea), }; List sortedSurfaceData = query.ToList(); return sortedSurfaceData; } –