分组时,如何从Linq查询返回IGrouping

我将一堆不同的零件添加到一个List<>并且一些零件可能具有相同的零件号和相同的长度。 如果他们有相同的零件号码和相同的长度,我需要将这些零件分组来显示。

当他们分组时,我需要显示该部分的数量,以及具有特定长度的部分数量。

我需要知道如何将两个不同的属性组合在一起,然后用List<ICutPart>返回一个types化的对象,

下面是我所能得到的,我试图返回(IGrouping<int,ICutPart>)sGroup; 但是我在函数体的返回部分发生错误。

我怎样才能返回一个types的对象与Group{List<ICutPart> Parts, Int Total}

  public class CutPart : ICutPart { public CutPart() { } public CutPart(string name, int compID, int partID, string partNum, decimal length) { this.Name = name; this.PartID = partID; this.PartNumber = partNum; this.CompID = compID; this.Length = length; } public CutPart(string name, int compID, int partID, string partNum, decimal width, decimal height) { this.Name = name; this.CompID = compID; this.PartNumber = partNum; this.PartID = partID; this.Width = width; this.Height = height; this.SF = decimal.Parse(((width / 12) * (height / 12)).ToString(".0000")); //2dp Number; } public string Name { get; set; } public int PartID { get; set; } public string PartNumber { get; set; } public int CompID { get; set; } public decimal Length { get; set; } public decimal Width { get; set; } public decimal Height { get; set; } public decimal SF { get; set; } } public class CutParts : List<ICutPart> { public IGrouping<int, ICutPart> GroupParts() { var sGroup = from cp in this group cp by cp.Length into g select new { CutParts = g, total = g.Count() }; return (IGrouping<int, ICutPart>)sGroup; } public new void Add(ICutPart item) { base.Add(item); } } 

我想你想要创建ICutPart对象,其中每个组对象具有共同的Length和一堆具有该长度的ICutPart

在代码中,它看起来像这样:

 public IEnumerable<IGrouping<int, ICutPart>> GroupParts() { return this.GroupBy( o => o.Length ); } 

这可能需要解释!


IEnumerable位是组对象的集合 – 对于每个不同的Length

该集合中的每个“组对象”都是一个IGrouping<int, ICutPart>

这个对象有一个Key属性,在这种情况下,这是你分组的东西。

它也是一个集合, IGrouping<T>IEnumerable<T> IGrouping<T>派生 – 它是具有这个长度的ICutPart的集合。

如果您在其中一个组对象上调用ToList() ,您将得到一个List<ICutPart>


为了使调用者更容易,可以创建一个类来保存这些值。

如果你宣布这样的一个类:

 public class GroupedByLength { public int Length { get; set; } public List<ICutPart> CutParts { get; set; } } 

那么你可以返回这些对象的集合:

 public List<GroupedByLength> GroupParts() { return this .GroupBy( o => o.Length ) .Select( g => new GroupedByLength { Length = g.Key, CutParts = g.ToList(), } ) .ToList() ; } 

您试图将IEnumerable<IGrouping<int ICutPart>><IGrouping<int ICutPart>> ; 这将永远不会工作。 您将不得不从IEnumerable <>中选择一个instnace,也许这样:

 return sGroup.FirstOrDefault();