使用linq将集合中的项合并在一起

本文关键字:合并 在一起 linq 集合 使用 | 更新日期: 2023-09-27 18:00:52

我有一个对象列表(称它们为类型salesItems(假设这些项目有50个属性,名称、价格和数量是其中的3个(。我想知道如何使用以下逻辑将列表合并在一起,按名称组合任何salesItems:

如果有多个salesOrder具有相同的名称:

  • 将它们合并为一个具有相同名称的SalesOrder
  • 将数量设置为数量的总和
  • 使用第一个的值设置价格和所有其他属性

我想和林克做生意。我意识到我可以对每个c循环使用一个big。

如果列表中还有其他项目,我也希望遵循类似的逻辑。

EX:    A salesOrder list with (A,B,C,D,E)
A: Name=ball  Price= 2.24  Quantity=1   (other values = bla bla)
B: Name= ball  Price = 15.33  Quantity=3   (other values)
c: Name= bat  Price = 22.14  Quantity=3    (other values)
D: Name= bat Price= 19.22 Quantity=2    (other values)
E: Name = ball Price=4.32 Quantity=2   (other values)

结果列表我想要列表中的2个销售订单(A,C(A:名称=球价=2.24数量=6(其他值=a的财产中的bla bla(c:名称=蝙蝠价格=22.14数量=5(c的其他值属性(

使用linq将集合中的项合并在一起

您想要linq的.GroupBy方法!!!

我把你的班级定义为:

public class SalesOrder
{   
    public string Name { get; set; }
    public double Price { get; set; }
    public int Quantity { get; set; }
    public SalesOrder(string Name, double Price, int Quantity)
    {
        this.Name = Name;
        this.Price = Price;
        this.Quantity = Quantity;
    }
}

然后我创建了一个你的订单列表,如下所示:

List<SalesOrder> Orders = new List<SalesOrder>()
{
    new SalesOrder("Ball", 2.24, 1),
    new SalesOrder("Ball", 15.33, 3),
    new SalesOrder("Bat", 22.14, 3),
    new SalesOrder("Bat", 19.22, 2),
    new SalesOrder("Ball", 4.32, 2)
};

并按名称对它们进行分组,然后为每个组选择所需的值,将其放入SalesOrder类的新实例中,如下所示:

List<SalesOrder> Combined_Orders = Orders
    .GroupBy (o => o.Name)
    .Select (o => new SalesOrder(o.Key, o.Select (x => x.Price).First(), o.Sum(x => x.Quantity)))
    .ToList();

更新:针对OP的评论

由于真正的SalesOrder将有数百个属性,因此可以避免在linq查询中键入所有属性,方法是向SalesOrder类添加一个构造函数,该构造函数接受组的结果作为参数,然后在构造函数中执行所有工作。虽然它并不能阻止您键入所有属性,但它确实意味着它被巧妙地抽象掉了。同样,通过这种方式,它强制/使您能够决定如何处理每个属性(first/sum/average(。

要做到这一点,你需要第二个构造函数,看起来像这样:

    public SalesOrder(IGrouping<string, SalesOrder> Group)
    {
        this.Name = Group.Key;
        this.Price = Group.First().Price;
        this.Quantity = Group.Sum(g => g.Quantity);
        // do all other properties here too
    }

然后通过更新组,使其看起来像这样(注意,现在只有分组"g"的结果被传递到构造函数中(:

List<SalesOrder> Combined_Orders = Orders
    .GroupBy (o => o.Name)
    .Select (g => new SalesOrder(g))
    .ToList();

Hi您可以使用以下代码,

class SalesItem
{
    public string Name { get; set; }
    public int Price { get; set; }
    public int Quantity { get; set; }
}
class SalesOrder
{
    public void LoadItems()
    {
        List<SalesItem> SalesItems = new List<SalesItem>();
        SalesItem salesitem = new SalesItem()
        {
            Name = "Ball",
            Price = 12,
            Quantity = 1
        };
        SalesItems.Add(salesitem);
        salesitem = new SalesItem()
        {
            Name = "Ball",
            Price = 36,
            Quantity = 3
        };
        SalesItems.Add(salesitem);
        salesitem = new SalesItem()
        {
            Name = "Bat",
            Price = 50,
            Quantity = 1
        };
        SalesItems.Add(salesitem);
        salesitem = new SalesItem()
        {
            Name = "Ball",
            Price = 84,
            Quantity = 7            
        };
        SalesItems.Add(salesitem);
        salesitem = new SalesItem()
        {
            Name = "Bat",
            Price = 150,
            Quantity = 3
        };
        SalesItems.Add(salesitem);
        GroupOrders(SalesItems);
    }
    public List<SalesItem> GroupOrders(List<SalesItem> SalesItems)
    {
        var list = from item in SalesItems
                   group item by item.Name into orders
                   select new SalesItem
                   {
                       Name = orders.Key,
                       Price = orders.Sum(X=>X.Price),
                       Quantity = orders.Sum(X=>X.Quantity)
                   };
        List<SalesItem> resultList = new List<SalesItem>();
        foreach (SalesItem saleitem in list)
        {
            resultList.Add(saleitem);
        }
        return resultList;
    }
}