C# 使用旧列表中的条件创建新列表

C# Create new list with conditions from old list

这是我的问题: 假设我有一个块 class 和一个块列表:

List<Block> blocks = new List<Block> ();

Block b1 = new Block ();
b1.id_material = 1;
b1.id_color = 1;
b1.weight = 1.5f;

Block b2 = new Block();
b2.id_material = 2;
b2.id_color = 1;
b2.weight = 3f;

Block b3 = new Block();
b3.id_material = 1;
b3.id_color = 1;
b3.weight = 4.5f;

blocks.Add (b1);
blocks.Add (b2);
blocks.Add (b3);

class Block
{
    public int id_material { get; set; }
    public int id_color { get; set; }
    public float weight { get; set; }
}

如您所见,每个方块都有其 material、颜色和重量。 我需要创建一个新列表,如果两个或多个块具有相同的颜色和 material,它必须对它们的权重求和。

在这个例子中,新列表应该有两个块,liko so:

List<Block> new_blocks = new List<Block> ();

Block b1 = new Block ();
b1.id_material = 1;
b1.id_color = 1;
b1.weight = 6f; //1,5 + 4,5

Block b2 = new Block();
b2.id_material = 2;
b2.id_color = 1;
b2.weight = 3f;

new_blocks.Add(b1);
new_blocks.Add(b2);

有什么办法可以做到吗? 谢谢!

这可以使用 GroupBy 使用命名空间 System.Linq 来完成,例如:

var new_blocks = blocks.GroupBy(x=> 
                                   new 
                                   { 
                                    x.id_material , 
                                    x.id_color  
                                   }
                                 )
                       .Select(x => new Block()
                                        {
                                           id_material = x.Key.id_material,
                                           id_color = x.Key.id_color,
                                           weight = x.Sum(y => y.weight)  
                                        }).ToList();

所以我们根据id_materialcolor对块进行了分组,然后我们将具有相同id_materialcolor的所有块的权重相加

输出:

id_material:1,id_color:1,weight:6
id_material:2,id_color:1,weight:3

参考 working DEMO Fiddle here