考虑下面的Customer
类-
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public List<Product> Products { get; set; }
}
public class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
如果有一个List<Purchase>
,其中Purchase
是-
public class Purchase
{
public int CustomerId { get; set; }
public string CustomerName { get; set; }
public string ProductName { get; set; }
public int Price { get; set; }
}
,列表包含重复的客户相关信息,如-
var list = new List<Purchase>
{
new Purchase { CustomerId=1, CustomerName="Alice", ProductName="CPU", Price=250 },
new Purchase { CustomerId=1, CustomerName="Alice", ProductName="RAM", Price=100 },
new Purchase { CustomerId=1, CustomerName="Alice", ProductName="HDD", Price=150 },
new Purchase { CustomerId=2, CustomerName="Bob", ProductName="RAM", Price=100 },
new Purchase { CustomerId=2, CustomerName="Bob", ProductName="SSD", Price=200 },
};
我如何从这个列表中创建一个Customer
对象列表?
使用LINQ,您将希望使用分组by,然后使用子查询将分组结果映射到您的Customer
模型:
var customerList = from p in list
group p by new { p.CustomerId, p.CustomerName } into grp
select new Customer() {
Id = grp.Key.CustomerId,
Name = grp.Key.CustomerName,
Products = grp.Select(
prd => new Product() {
Name = prd.ProductName,
Price = prd.Price
}
).ToList()
};
或者,如果你愿意:
var customerList = list.GroupBy(p => new { p.CustomerId, p.CustomerName })
.Select(grp => new Customer() {
Id = grp.Key.CustomerId,
Name = grp.Key.CustomerName,
Products = grp.Select(
prd => new Product() {
Name = prd.ProductName,
Price = prd.Price
}
).ToList()
});
首先使用System.Linq
中的GroupBy
,然后使用Select
创建新的客户列表:
var customers = list.GroupBy(x => x.CustomerId)
.Select(x => x.FirstOrDefault())
.Select(x => new Customer {
Id = x.CustomerId,
Name = x.CustomerName
}).ToList();
customers.ForEach(x => {
x.Products = list.Where(t => t.CustomerId == x.Id)
.Select(t => new Product {
Name = t.ProductName,
Price = t.Price
}).ToList();
});