列出取决于/选择属性值的并集

时间:2019-01-22 16:07:50

标签: c# list linq

我有一个“项目”类:

    public class Item
    {
        public int Id { get; set; }
        public decimal Price { get; set; }

        public override bool Equals(object obj)
        {
            if (obj is Item item)
                return item.Id == Id;

            return false;
        }

        // GetHashCode omitted...
    }

我有2个列表需要合并:

        var items1 = new List<Item>
        {
            new Item { Id = 1, Price = 10 },
            new Item { Id = 2, Price = 10 },
            new Item { Id = 3, Price = 10 },
        };

        var items2 = new List<Item>
        {
            new Item { Id = 1, Price = 10 },
            new Item { Id = 2, Price = 8 },
            new Item { Id = 4, Price = 10 },
        };

我得到的工会:

var union = items1.Union(items2).ToList();

但是我还需要约束,即价格最低的物品在联合体内。因此,例如在上面的列表中,“ items2”中的Item.ID = 2必须在联合中...因此结果应为包含以下4个项目的列表:

  • 项目{ID = 1,价格= 10}
  • Item {ID = 2,Price = 8} //不是价格= 10的那个
  • 项目{ID = 3,价格= 10}
  • 项目{ID = 4,价格= 10}

在C#中是否有一种优雅的方法(最好使用Linq)?

1 个答案:

答案 0 :(得分:3)

您可以尝试使用 groupby ,如下所示:

var result = items1.Union(items2).GroupBy(x => x.Id)
                 .Select(x => new Item
                 {
                     Id = x.Key,
                     Price = x.Min(i => i.Price)
                 });