Reputation:
I'm working with database. I wanna get all messages and group them based on RoomId
(1 conversation contains the message(s) with the same RoomId
).
I've tried this:
public class Message
{
public string SenderId { get; set; }
public string ReceiverId { get; set; }
public string RoomId { get; set; }
}
class Program
{
static void Main()
{
var list = new List<Message>
{
new Message { SenderId = "Sender1", ReceiverId = "Receiver1", RoomId = "Room2" },
new Message { SenderId = "Sender1", ReceiverId = "Receiver1", RoomId = "Room1" },
new Message { SenderId = "Sender1", ReceiverId = "Receiver1", RoomId = "Room3" },
new Message { SenderId = "Sender1", ReceiverId = "Receiver1", RoomId = "Room1" },
new Message { SenderId = "Sender1", ReceiverId = "Receiver1", RoomId = "Room2" },
new Message { SenderId = "Sender1", ReceiverId = "Receiver1", RoomId = "Room3" }
};
var group_list = list.GroupBy(x => x.RoomId);
var output_list = new List<List<Message>>();
foreach (var item in group_list)
{
output_list.Add(item.ToList());
}
foreach (var item in output_list)
{
Console.WriteLine($"Conversation {output_list.IndexOf(item) + 1}");
foreach (var msg in item)
{
Console.WriteLine($"SenderId: {msg.SenderId}\tReceiverId: {msg.ReceiverId}\tRoomId: {msg.RoomId}");
}
Console.WriteLine();
}
}
}
Output:
I wanna inline the part:
foreach (var item in group_list)
{
output_list.Add(item.ToList());
}
to:
var group_list = list.GroupBy(x => x.RoomId).[...what's next?...];
How can I do that?
Upvotes: 4
Views: 92
Reputation: 460148
After GroupBy
you select the group which is IEnumerable<Message>
, so you can use ToList
:
List<List<Message>> output_list = list
.GroupBy(x => x.RoomId)
.Select(g => g.ToList())
.ToList();
Upvotes: 4