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_material
和color
对块进行了分组,然后我们将具有相同id_material
和color
的所有块的权重相加
输出:
id_material:1,id_color:1,weight:6
id_material:2,id_color:1,weight:3
这是我的问题: 假设我有一个块 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_material
和color
对块进行了分组,然后我们将具有相同id_material
和color
的所有块的权重相加
输出:
id_material:1,id_color:1,weight:6
id_material:2,id_color:1,weight:3