Список группировки перед добавлением в GridView - PullRequest
0 голосов
/ 02 мая 2019

У меня есть этот код, который добавляет элементы в список

private void GetParts(bool AllObjects)
{
    ModelObjectEnumerator ImportModel = null;
    List<Beam> parts = new List<Beam>();
    if (AllObjects)
    {
        ImportModel = MyModel.GetModelObjectSelector().GetAllObjectsWithType(ModelObject.ModelObjectEnum.BEAM);
    }
    else
    {
        TSMUI.ModelObjectSelector GetSelectedObjects = new TSMUI.ModelObjectSelector();
        ImportModel = GetSelectedObjects.GetSelectedObjects();
    }

    while (ImportModel.MoveNext())
    {
        Beam ThisBeam = ImportModel.Current as Beam;

        if (ThisBeam != null)
        {
            parts.Add(ThisBeam);

        }
    }

После этого я должен перебирать все элементы, добавляемые в GridView, как это

for (int i = 0; i < parts.Count; i++)
{ 
        DataRow row = dt.NewRow();

        var partMark = string.Empty;
        parts[i].GetReportProperty("PART_POS", ref partMark);
        row[0] = partMark;
        row[1] = parts[i].Profile.ProfileString;
        int num = 0;
        row[2] = parts[i].GetReportProperty("MODEL_TOTAL", ref num);
        double length = 0;
        parts[i].GetReportProperty("LENGTH", ref length);
        row[3] = length;
        dt.Rows.Add(row);
}

, но доЯ делаю это, я хочу сгруппировать элементы, используя (partMark, length) и Sum (num).

Как я могу это сделать? Заранее спасибо.

1 Ответ

1 голос
/ 06 мая 2019

Похоже, что вы хотите сделать, это сгруппировать ваши элементы по 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 возвращаются к своему первоначальному порядку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...