【问题标题】:GroupBy() method to return a DictionaryGroupBy() 方法返回一个字典
【发布时间】:2020-04-23 15:26:36
【问题描述】:

我有一个名为 Reservation 的类,它具有 StartDate 和 RoomNumber 属性。然后我有一个 Reservations 列表,我在其中使用 Linq 查找有冲突的预订(冲突意味着预订与列表中的其他预订具有相同的房间号和开始日期)

在以下代码中,我使用 GroupBy 方法从列表中查找重复项。但是我需要返回一个 Dictionary ,因为 GroupBy() 方法我不能再这样做了。如何访问 Reservation 类?

我怎样才能返回 Dictionary,因为现在我只能访问日期和数字属性,而不是 Reservation 类。 主类:

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 的 Reservation 与 Id=2 的 Reservation 和 Id=3 的 Reservation 有冲突,那么我的字典将包含 Id=1 作为键的 Reservation 和一个包含冲突保留的列表(Id 2 和 3)

【问题讨论】:

  • return Reservations.GroupBy(i =&gt; new {i.StartDate, i.RoomNumber}) .Where(g =&gt; g.Count &gt; 1) .ToDictionary(k=&gt;k.Key, v=&gt;v.ToList());
  • 如果我理解你的话,你想使用每个组的重复预订中的一个作为键,对吧?哪些重复保留(例如,最大或最小 StartDate)必须用作键?
  • 显示的代码有什么问题?
  • @gameloverr 在发布ConflictsWith 之后我认为Reservation 类还包含EndDateIdRoom,所以这不完全是像问题一样发布的内容吗?这里有一个问题:如果reservation id=1 和Id=2 发生冲突并给出2 个分组reservation。所以关键是保留1或2?不清楚,您可以在问题中添加所有具有预期结果的类和示例,以帮助我们了解您想要什么。

标签: c# linq dictionary


【解决方案1】:

更新问题后,您可以使用 :
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

希望对你有所帮助。

【讨论】:

  • @gamelorr 你能检查我的答案吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多