2013-03-14 4 views
0

В принципе у меня есть список номеров из отеля, Допустим, пользователь выбирает 3 номера сГенерация пары с список с помощью C#

1 комната с 2 взрослыми,
второй 4 взрослых
3-6 взрослых.

fine, Когда я отправляю этот запрос в службу XML. это дает мне номера с неуправляемым списком, поэтому мне нужно соединить эти номера на основе номера гостиничного номера, который является RO (ТОЛЬКО ДЛЯ КОМНАТЫ), . Каждый элемент пары должен иметь одинаковый ТИП НОМЕРА, но с каждой запрашиваемой комнатой, как описано выше.

Итак, я думаю, что у вас есть четкое изображение, что происходит :), Второе значение в свойствах занятости показывает здесь Количество взрослых. Я плохо разбираюсь в математике, но я думаю, что это своего рода SETS в Math.

В результате у нас есть всего 4 комнаты, в которых у нас есть первые 2 комнаты для 2 взрослых (// 1 и // 2). Поэтому мы должны соединить эти комнаты с другими (4 взрослых и 6 взрослых) номерами.

Теперь в этом случае мне нужно 3 пары, как описано ниже

SB, Только номер, 1,2 для 2 взрослых
SB, Room Only, 1,4 для 4 взрослых
СО, номер, только 1,6 для 6 взрослых

DQ, номер, только 1,2 для 2 взрослых
СО, только номер, 1,4 для 4 взрослых
SB, только номер, 1,6 для 6 взрослых

СО, завтрак, 1,2 для 2 взрослых
СО, завтрак, 1,4 для 4 взрослых
СО, завтрак, 1,6 для 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 
+1

как об использовании на структуру? или строка? – Danahi

+3

Непонятно, почему пары дублируются в вашем примере. Можете ли вы, возможно, расширить, какие правила вы ожидаете от этого? то есть * почему * есть 12 выходов из этих 8 входов? –

+0

Здравствуйте, @MarcGravell извините за мой последний неясный вопрос. Теперь я думаю, что вы можете понять, что мне нужно. –

ответ

1

Может быть, это может направить вас в правильном направлении:

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

Cheers, Алекс

EDIT: Это дает:

RO, 1,2 
RO, 1,2 
RO, 1,4 
RO, 1,6 
AB, 1,2 
AB, 1,2 
AB, 1,4 
AB, 1,6 
+0

Не думайте, что это то, чего хочет автор. – MarcinJuraszek

0

Похоже, что вы хотите, чтобы де-простофили список, а затем удвоить его. Смотрите код ниже:

var distinctList = listOfOccupancy.Select(l => new { l.room, l.occupancy }).Distinct(); 
var doubledList = distinctList.Concat(distinctList); 
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. В этом случае у нас есть список анонимных объектов с room, occupancy и index. После правильной сортировки у вас есть данные в правильном порядке.

Результат представляет собой список с следующим порядком:

AB 1,2 
AB 1,4 
AB 1,6 
AB 1,2 
RO 1,2 
RO 1,4 
RO 1,6 
RO 1,2 
Смежные вопросы