使用c#生成与List的对

时间:2013-03-14 13:13:46

标签: c# linq generic-collections

基本上我有酒店的房间清单, 让我们说用户选择3个房间

第一个房间有2名成人,
第2名有4名成人 第3名,有6名成年人。

很好,当我将此请求发送到XML服务时。它给了我房间的非配对列表,所以我需要配对 这些房间位于酒店房间类型的RO(仅限房间), 每对元素应具有相同的ROOM TYPE,但如上所述,每个请求的房间都有。

所以我认为你现在已经清楚了解正在发生什么:),占用属性中的第二个值显示在这里成人数量。 我不擅长数学,但我认为它是数学中的某种SETS。

结果我们共有4个房间,其中我们有2个成人的前2个房间(// 1和// 2)所以我们必须将这些房间与其他房间(4个成人和6个成人)房间配对。

现在在这种情况下我需要3对,如下所述

  SB,仅限房间,2名成人1,2
  SB,仅限房间,4名成人<1,4>   SB,仅限房间,6名成人1,6
  
  DQ,仅限客房,2名成人1,2
  SB,仅限房间,4名成人<1,4>   SB,仅限房间,6名成人<1,6>

     SB,早餐,2名成人1,2
  SB,早餐,4名成人1,4
  SB,早餐,6名成人1,6

public class rr {
   public string roomType { get; set; }
   public string room { get; set; }
   public string occupancy { get; set; }        
}

List<rr> listOfOccupancy = new List<rr>();

listOfOccupancy.Add(new rr { roomType = "SB", room = "Room Only", occupancy = "1,2" }); //1
listOfOccupancy.Add(new rr { roomType = "DQ", room = "Room Only", occupancy = "1,2" }); //2
listOfOccupancy.Add(new rr { roomType = "SB", room = "Room Only", occupancy = "1,4" }); //3
listOfOccupancy.Add(new rr { roomType = "SB", room = "Room Only", occupancy = "1,6" }); //4 

listOfOccupancy.Add(new rr { roomType = "SB", room = "Breakfast", occupancy = "1,2" }); //5
listOfOccupancy.Add(new rr { roomType = "SB", room = "Breakfast", occupancy = "1,4" }); //6
listOfOccupancy.Add(new rr { roomType = "SB", room = "Breakfast", occupancy = "1,6" }); //7

3 个答案:

答案 0 :(得分:1)

也许这可能会指出你正确的方向:

    var x = listOfOccupancy
        .OrderByDescending(r => r.room)
        .ThenBy(r => r.occupancy)
        // Optional distinct using equality comparer
        //.Distinct(...)
        .ToList();

干杯,亚历克斯

编辑:这会产生:

RO, 1,2
RO, 1,2
RO, 1,4
RO, 1,6
AB, 1,2
AB, 1,2
AB, 1,4
AB, 1,6

答案 1 :(得分:0)

看起来你想要删除列表,然后加倍。请参阅以下代码:

var distinctList = listOfOccupancy.Select(l => new { l.room, l.occupancy }).Distinct();
var doubledList = distinctList.Concat(distinctList);

答案 2 :(得分:0)

我有一个解决方案,看起来有点复杂,但做了你想做的事情:

var results = listOfOccupancy.GroupBy(rr => rr.room)
                             .Select(g => g.GroupBy(rr => rr.occupancy).SelectMany(g2 => g2.Select((rr, i) => new { rr, i })))
                             .SelectMany(g => g.Select(g2 => g2))
                             .OrderBy(e => e.rr.room)
                             .ThenBy(e => e.i)
                             .ThenBy(e => e.rr.occupancy)
                             .Select(e => e.rr)
                             .ToList();

它做什么?首先,它按room属性值对输入列表进行分组。对于每个组,它再次按occupancy分组,并为每个子组中的元素分配索引。之后,所有群组都使用SelectMany展平。在这一点上,我们有一个包含roomoccupancyindex的匿名对象列表。正确排序后,您的数据将按正确顺序排列。

结果是一个包含以下顺序的列表:

AB 1,2
AB 1,4
AB 1,6
AB 1,2
RO 1,2
RO 1,4
RO 1,6
RO 1,2