Метод GroupBy () для возврата словаря - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть класс с именем Reservation, который имеет свойства StartDate и RoomNumber. Затем у меня есть список Бронирование, в котором я использую Linq для поиска резервирований, в которых есть конфликты (конфликт означает, что резервирование имеет тот же номер комнаты и дату начала, что и другие резервирования в списке)

В следующем коде: Я использовал метод GroupBy, чтобы найти дубликаты из списка. Но мне нужно вернуть Dictionary <>, который я больше не могу сделать из-за метода GroupBy (). Как я могу получить доступ к классу бронирования?

Как я могу вернуть Словарь, потому что сейчас я могу получить доступ только к свойствам даты и числа, а не к классу бронирования. Класс main:

return Reservations.GroupBy(i => new {i.StartDate, i.RoomNumber}).Where(g => g.Count)>1).Select(group => new {
   key=group.Key,
   value=group.ToList()
}).Select(f => new Dictionary <Reservation, List<Reservation>> (f.key, f.value);

Например: если резервирование с Id = 1 конфликтует с резервированием с Id = 2 и с резервированием с Id = 3, тогда мой словарь будет содержать резервирование с Id = 1 в качестве ключа и Список, содержащий оговорки в конфликте (с Id 2 и 3)

1 Ответ

1 голос
/ 23 апреля 2020

После обновления вопроса вы можете использовать:
OrderBy для заказа бронирования.
GroupBy для сгруппировать по дате и номеру комнаты.
ToDictionary , чтобы создать словарь (резервирование, список резервирований), например, следующий код:

Dictionary<Reservation, List<Reservation>> result = reservations.OrderBy(r => r.Id)
    .GroupBy(x => new { x.StartDate, x.Room.Number })
    .Where(x => x.Count() > 1)
    .ToDictionary(
        x => x.First(),
        y => y.Skip(1).ToList()
    );

Для теста:

List<Reservation> reservations = new List<Reservation>
{
    new Reservation {Id = 5, StartDate = DateTime.Now.Date, Room  = new Room{ Number = 4 }},
    new Reservation {Id = 3, StartDate = DateTime.Now.Date, Room  = new Room{ Number = 3 }},
    new Reservation {Id = 1, StartDate = DateTime.Now.Date, Room  = new Room{ Number = 2 }},
    new Reservation {Id = 2, StartDate = DateTime.Now.Date, Room  = new Room{ Number = 2 }},
    new Reservation {Id = 4, StartDate = DateTime.Now.Date, Room  = new Room{ Number = 2 }},
    new Reservation {Id = 6, StartDate = DateTime.Now.Date, Room  = new Room{ Number = 4 }}
};

Демо

foreach(var item in result)
{
    Console.WriteLine($"Key : Id::{item.Key.Id} : Number::{item.Key.Room.Number} ==> Values: ");
    foreach(var item1 in item.Value)
    {
        Console.WriteLine($"Id::{item1.Id} : Number::{item1.Room.Number}");
    }
}

Результат

Key : Id::1 : Number::2 ==> Values:
Id::2 : Number::2
Id::4 : Number::2
Key : Id::5 : Number::4 ==> Values:
Id::6 : Number::4

Надеюсь, это поможет.

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