2014-02-21 47 views
1

我得到这个错误,当我尝试groupby CellID。不能隐式转换类型时groupby

无法隐式转换类型 'System.Collections.Generic.List System.Linq.IGrouping INT,p2pControllerLogAnalyser.Models.GSMData' 到 'System.Collections.Generic.List p2pControllerLogAnalyser.Models.GSMData'

public List<GSMData> GetCellID() 
{ 
    return Gsmdata.GroupBy(x => x.CellID) 
        .ToList(); 
} 

我在做什么错,我该如何解决?

+6

'GroupBy'返回'IEnumerable的>',所以它不能被转换为'列表'以你正在做的方式。你为什么分组?为什么不用'OrderBy'呢?分组然后立即尝试平铺列表可能是a)意想不到的,或者b)模仿排序语义。 –

+1

什么预期输出? – Grundy

+0

我想显示CellID的列表以及每个CellID使用多少个Meters。分组部分是因为有多个条目具有相同的CellID,我不想重复 – user3240428

回答

5

如果你真的需要做到这一点,虽然我不能想象,为什么你需要使用SelectMany拼合每组可枚举到一个列表:

public List<GSMData> GetCellID() 
{ 
    return Gsmdata 
     .GroupBy(x => x.CellID) 
     .SelectMany(gr => gr) 
     .ToList(); 
} 

当然,这看起来像你想批量项目具有相同CellID在一起,所以你总是可以简单地订购吧:

public List<GSMData> GetCellID() 
{ 
    return Gsmdata 
     .OrderBy(x => x.CellID) 
     .ToList(); 
} 


而且您的意见,不同的 CellID值可以被重新从而转向:

return Gsmdata.Select(x => x.CellID).Distinct(); 

如果你想返回一个ID和分组数据的数量,你可以捆绑到这一个匿名类型:

return Gsmdata 
    .GroupBy(x => x.CellID) 
    .Select(gr => new { CellID = gr.Key, Count = gr.Count() }); 

但如果你是从一个方法我回来这'做一个可发现的类型,不使用匿名类型。

0

问题是GroupBy返回一个分组集合,在这种情况下System.Collections.Generic.List<System.Linq.IGrouping<int, p2pControllerLogAnalyser.Models.GSMData>>。你的方法返回一个List<GSMData>

为了解决这个问题,您需要调整您的方法声明和/或您的Linq查询,以便类型匹配。

从您的意见,我明白你想要返回不同的单元格ID列表。你可以通过改变两种方法声明和LINQ查询做到这一点(我假设的CellID是基于在IGrouping类型int类型):

public List<int> GetCellID() 
{ 
    return Gsmdata.Select(x => x.CellID) 
        .Distinct().ToList(); 
} 
0

如果我理解正确的,你需要的是这样的

var result = (from gdata in Gsmdata 
       group gdata by gbata.CellID into g 
       select new Result{ 
        CellID = g.Key, 
        Meters = g.Sum(i=>i.Meter) 
       } 
      ).ToList(); 

Result哪里是

public class Result{ 
    public /*type your CellID */ CellID; 
    public /*type your Meter */ Meters; 
}