Получите пересечение двух списков с конкретными критериями

Допустим, у меня есть два списка автомобилей

List1:

  • "Феррари", 2005, "$350, 000"
  • "BMW" , 2009, "$29, 000"
  • "Audi", 2011, "$33, 000"

List2:

  • "бесконечности", 2005, "$267, 000"
  • "BMW" , 2009, "$45, 000"
  • "Ferrari", 2005, "$33 +0000"
  • "Тойота", 2009, "$35, 000"

Я знаю, что я могу получить список дубликатов автомобилей с помощью метода Intersect. Но я хотел бы также сохранить тот, у которого есть меньшая цена. Например, я хочу вернуть какой-либо метод:

  • "Ferrari", 2005, "$33 +0000"
  • "BMW" , 2009, "$29, 000"

потому что это автомобили, которые повторяются с именем и имеют наименьшую цену

+1
источник поделиться
3 ответа

Полностью непроверенный, но как насчет чего-то подобного?

var result = from c1 in List1
             join c2 in List2 on c1.Name equals c2.Name
             select new CarInfo()
             {
                 Name = c1.Name, // Doesn't really matter which you take
                 Year = c1.Price < c2.Price ? c1.Year : c2.Year,
                 Price = c1.Price < c2.Price ? c1.Price : c2.Price
             };
+3
источник

Что-то вроде этого? Я предполагаю, что у вас есть бит CarComparer IEquality для Intersect.

var cheapCars = list1.Intersect(list2, new CarComparer()).
    OrderBy(c => c.Price).
        GroupBy(c => c.Name).
            Select(g => g.FirstOrDefault());

Возможно, вам придется исправить синтаксис...

+1
источник

Следующий запрос будет соответствовать автомобилям в свойствах Brand и Year. Если вы только заботитесь о Brand, вы можете изменить критерии соединения для достижения этой цели.

var results = from car1 in list1
              join car2 in list2 
                on new { car1.Brand, car1.Year } 
                equals new { car2.Brand, car2.Year }
              select (car1.Price <= car2.Price) ? car1 : car2;
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос