2015-12-05 3 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 (List RAWDATA) { sortedSurfData0 = (IEnumerable >) rawData.GroupBy (т => новый SortedSurfaceData {roomSorted = t.RoomElement, elemTypeSorted = t.elemType, dblTypeAreaInRoom = rawData.Sum (a => t.dblArea)}); } –

+0

Запрос в методе 'SortRoomSurfData' выглядит правильно (за исключением того, ничего не делает) – jeroenh

+0

TNX jeroenh Это работало: общественного List SortRoomSurfData (List lstRawData) { уага запроса = от RAWDATA в lstRawData группы RAWDATA новым {rawData.idRoomElem, rawData.idElemType} в sortedData выбрать новый SortedSurfaceData() { idRoomSorted = sortedData.Key.idRoomElem, idElemTypeSorted = sortedData.Key.idElemType, dblTypeArea = sortedData.Sum (x => x.dblInstArea), }; Список <СортировкаSurfaceData> sortedSurfaceData = query.ToList(); return sortedSurfaceData; } –

ответ

0

Tnx jeroenh и 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; 
     }