user9235753
user9235753

Reputation:

How to group and split items in a list by inline code?

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:

Output snapshot

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

Answers (1)

Tim Schmelter
Tim Schmelter

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

Related Questions