2015-12-05 52 views
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只返回一個房間。

+0

對不起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)}); } –

+0

在你的方法查詢'SortRoomSurfData'看起來是正確的(除了它沒有做任何事情) – jeroenh

+0

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; } –

回答

0

Tnx jeroenh and miken for tips

此代碼適用於我。 似乎要做它應該做的:-)

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