У меня есть необработанный список в 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 (List RAWDATA) { sortedSurfData0 = (IEnumerable >) rawData.GroupBy (т => новый SortedSurfaceData {roomSorted = t.RoomElement, elemTypeSorted = t.elemType, dblTypeAreaInRoom = rawData.Sum (a => t.dblArea)}); } –
Запрос в методе 'SortRoomSurfData' выглядит правильно (за исключением того, ничего не делает) – jeroenh
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; } –