我在List<>中添加了一堆不同的部分,其中一些部分可能具有相同的部件号和相同的长度。如果它们的零件号和长度相同,则需要将这些零件分组以进行显示。

将它们分组后,我需要显示该零件号以及特定长度的零件号。

我需要知道如何使用两个不同的属性进行分组,并使用List<ICutPart>和总计

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

如何返回带有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);
    }

}

最佳答案

我想您想创建一堆组对象,其中每个组对象都具有公共(public)Length和一堆具有该长度的ICutPart

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

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

那可能需要解释!
IEnumerable位是组对象的集合-每个不同的Length一个

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

该对象具有Key属性,在这种情况下,该属性是按Length分组的对象。

这也是IGrouping<T>源自IEnumerable<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()
  ;
}

09-16 12:16