我有将此代码添加到列表中的代码
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)对项目进行分组。
我该怎么办?谢谢。
答案 0 :(得分:1)
听起来您想做的是按partMark和长度对项目进行分组,然后按num的总和对列表中的分组项目进行排序。我建议使用LINQ进行分组/排序。
使用IEnumerable的GroupBy方法时,返回类型为IEnumerable>。这意味着您无法将项目列表重新组合到自身中,这是我在试图回答此问题时的首次尝试。
为解决此问题,我创建了一个名为GroupedPart的类,该类具有与Part相同的字段,但是添加了一个“ Parts”属性来包含由PartLength和PartMark分组在一起的Part对象的列表。
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;
}
}
}
然后,在创建了支持对象之后,您可以使用此代码对它们进行分组和排序。第二个代码块只是一个带有DataGridView的Form对象,因此可以看到分组和排序的结果。
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组合,因此它们被单独分组。此外,您将看到“指甲”部分(指甲#1,指甲2,指甲3)已重新排序(指甲2,指甲1,指甲3),因为它们分配了“数字”属性。如果注释掉OrderBy代码行,您将看到Hammer对象仍然分组在一起,但是Nail对象恢复为原始顺序。