【问题标题】:Group and sum List分组和求和列表
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-06-02
    • 2019-10-09
    • 1970-01-01
    • 2019-12-27
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    相关资源
    最近更新 更多