Список объединений, который зависит / выбирается от значений свойств - PullRequest
0 голосов
/ 22 января 2019

У меня есть класс "item":

    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();

Но мне нужно также ограничить, чтобы предметы с самой низкой ценой находились в союзе. Так, например, в приведенных выше списках Item.ID = 2 из "items2" должен быть в объединении ... поэтому результатом должен быть список, состоящий из этих 4 элементов:

  • Item {Id = 1, Price = 10}
  • Item {Id = 2, Price = 8} // Не тот, у которого Price = 10
  • Item {Id = 3, Price = 10}
  • Item {Id = 4, Price = 10}

Есть ли элегантный способ сделать это в C # (желательно с использованием Linq)?

1 Ответ

0 голосов
/ 22 января 2019

Вы можете попробовать использовать groupby , как показано ниже:

var result = items1.Union(items2).GroupBy(x => x.Id)
                 .Select(x => new Item
                 {
                     Id = x.Key,
                     Price = x.Min(i => i.Price)
                 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...