通过对重复信息进行分组从列表中创建对象

  • 本文关键字:列表 创建对象 信息 c# linq
  • 更新时间 :
  • 英文 :


考虑下面的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();
});

最新更新