将清单合并为一个清单,其中清单中最便宜的

时间:2019-02-25 10:06:08

标签: c# algorithm linq sorting data-structures

我有两个清单,其中包含来自不同来源的酒店价格,但是,我想将这两个清单合并,并创建最终清单,其中仅包括这两个清单之间最便宜的结果?谁能告诉我实现这一目标的最佳方法是什么?我当时在考虑使用交叉联接,但是我认为这将需要大量的计算时间。

酒店精选:

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; }

    }
}

以上将添加到输出集合酒店

如果酒店ID相同,我想比较集合 Vendor1Hotels Vendor2Hotels 中每个酒店的房间类别的totalprice属性,并将其添加到 Hotels 集合,否则无需进行比较,只需将该酒店添加到最终集合 Hotels 中即可。

3 个答案:

答案 0 :(得分:0)

我将为每个列表创建一个酒店字典,将其映射到价格。然后浏览两个列表并比较价格。请注意,使用字典将把算法的复杂度从O(N)* O(M)降低到O(N)+ O(M),其中N,M是每个列表中的元素数。这是因为字典的搜索复杂度为O(1)。使用单个字典实际上可以得到类似的结果,但这将导致代码更复杂。

答案 1 :(得分:0)

您可以按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();

答案 2 :(得分:0)

认为我来晚了,但是这是我要怎么做。

 var result = vendor2Hotels.Union(vendor1Hotels)
                           .GroupBy(hotel => hotel.hotelId)
                           .Select(hotelgroup => 
                                   hotelgroup.OrderBy(hotel => hotel.room.totalPrice).First())
                           .ToList();