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