Похоже, что вы хотите сделать, это сгруппировать ваши элементы по partMark и длине, а затем отсортировать сгруппированные элементы в списке по сумме чисел.Я бы порекомендовал использовать LINQ для группировки / сортировки.
При использовании метода GroupBy в IEnumerable тип возвращаемого значения - IEnumerable>.Это означает, что вы не можете сгруппировать список элементов обратно в себя, что я и пытался сделать в первой попытке ответить на этот вопрос.
Чтобы решить эту проблему, я создал класс с именем GroupedPart, который имеет те же поля, что и Part, но добавляет свойство «Parts» для хранения объектов Списка деталей, которые сгруппированы по PartLength и PartMark.
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApplication1
{
public class Part
{
public String Name {get; set;}
public double PartLength {get; set;}
public double PartMark {get; set;}
public int Number {get; set;}
public Part(String partName, double length, double mark, int value)
{
Name = partName;
PartLength = length;
PartMark = mark;
Number = value;
}
}
public class GroupedPart
{
public String Name => Parts.First().Name;
public double PartLength { get; set; }
public double PartMark { get; set; }
public int Number { get; set; }
public List<Part> Parts { get; set; }
public override string ToString()
{
return Name;
}
}
}
Затем, с созданными вспомогательными объектами, вы можете использовать этот код для группировки и упорядочения их.Этот второй блок кода представляет собой просто объект Form с DataGridView, так что сгруппированные и отсортированные результаты видны.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private List<Part> parts;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
parts = new List<Part>();
parts.Add(new Part("Hammer #1", 1, 5, 3));
parts.Add(new Part("Hammer #2", 1, 5, 4));
parts.Add(new Part("Hammer #3", 1, 1, 6));
parts.Add(new Part("Nail #1", 7, 10, 14));
parts.Add(new Part("Nail #2", 8, 10, 13));
parts.Add(new Part("Nail #3", 9, 10, 15));
parts.Add(new Part("Screw", 16, 17, 18));
var results = parts.GroupBy(part => new {part.PartLength, part.PartMark})
.Select(grouped => new GroupedPart()
{
PartLength = grouped.Key.PartLength,
PartMark = grouped.Key.PartMark,
Parts = grouped.ToList()
})
.OrderBy(p => p.Parts.Sum(part => part.Number));
List<GroupedPart> groupedParts = results.ToList();
dataGridView1.DataSource = groupedParts;
}
}
}
Если вы запустите этот код, вы увидите Hammer # 1 и Hammer # 2сгруппированы вместе, потому что они имеют одинаковые PartLength и PartMark.Другие части сгруппированы сами по себе, потому что они имеют уникальные комбинации PartLength / PartMark.Кроме того, вы увидите, что части "Nail" (Nail # 1, Nail # 2, Nail # 3) переупорядочиваются (Nail # 2, Nail # 1, Nail # 3), потому что им присвоено свойство "Number".Если вы закомментируете строку кода OrderBy, вы увидите, что объекты Hammer остаются сгруппированными, но объекты Nail возвращаются к своему первоначальному порядку.