Объединение списков в один список, среди которых самые дешевые - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть два списка, которые содержат цены на отели из разных источников, однако я хочу объединить эти два списка и создать окончательный список, который будет включать только самые дешевые результаты между этими двумя?Может кто-нибудь сказать мне, что будет лучшим способом достичь этого?Я думал использовать перекрестное соединение, однако я чувствую, что это займет много времени вычислений.

Коллекция отелей:

using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
   public class Program
    {

       static List<hotel> vendor1Hotels = new List<hotel>{new hotel
        {
            room = new Room
            {
                roomId = 2,
                totalPrice = 200
            },
            hotelId = 2,
            vendorId = 1
        } };

      static  List<hotel> vendor2Hotels = new List<hotel>{new hotel
        {
            room = new Room
            {
                roomId = 2,
                totalPrice = 300
            },
            hotelId = 2,
            vendorId = 2
        } };

        static List<hotel> Hotels { get; set; } = new List<hotel>();

        static void Main(string[] args)
        {
            foreach (var hotel1 in vendor1Hotels)
            {
                foreach (var hotel2 in vendor2Hotels)
                {
                    if(hotel1.hotelId == hotel2.hotelId)
                    {
                     if(hotel1.room.totalPrice < hotel2.room.totalPrice)
                        {
                            Hotels.Add(hotel1);
                        }else
                        {
                            Hotels.Add(hotel2);
                        }
                    }
                }
            }           
        }
    }

   public class hotel
    {

       public Room room { get; set; }

        public int vendorId { get; set; }

        public int hotelId { get; set; }

    }

    public class Room
    {

        public int roomId { get; set; }

        public double totalPrice { get; set; }

    }
}

выше будет добавлена ​​к выходной коллекции Отели

Я хочу сравнить свойство totalprice класса номерав каждом отдельном отеле из коллекций Vendor1Hotels и Vendor2Hotels , если идентификатор отеля равен и добавьте его в Hotels , иначе сравнивать не нужно, нужно просто добавить, чтоОтель до итоговой коллекции Отели .

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Вы можете сгруппировать номера отеля по hotelId, roomId, vendorId, а затем просто взять самые дешевые из каждой группы, например,

var ret = response1.Vendor1Hotels.Union(response2.Vendor2Hotels)
            .GroupBy(x => new {x.hotelId, x.vendorId, x.room.roomId})
            .Select(x=>x.OrderBy(r=>r.room.totalPrice).First())
            .ToList();
0 голосов
/ 13 марта 2019

Думаю, я опоздал, но вот как я это сделаю.

 var result = vendor2Hotels.Union(vendor1Hotels)
                           .GroupBy(hotel => hotel.hotelId)
                           .Select(hotelgroup => 
                                   hotelgroup.OrderBy(hotel => hotel.room.totalPrice).First())
                           .ToList();
0 голосов
/ 25 февраля 2019

Я бы создал словарь отелей для каждого списка, который бы сопоставлял отель с ценой.Затем просмотрите оба списка и сравните цены.Обратите внимание, что использование словаря снизит сложность алгоритма с O (N) * O (M) до O (N) + O (M), где N, M - количество элементов в каждом списке.Это потому, что словарь имеет сложность поиска O (1).На самом деле вы можете получить аналогичный результат с одним словарем, но это приведет к немного более сложному коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...