Link to home
Start Free TrialLog in
Avatar of whorsfall
whorsfallFlag for Australia

asked on

C# Linq complex grouping question.

Hi,

I have some procedural .NET core code I would like to convert to Linq - or at least get as close as I can.

From the code below have "group_list" generated via linq.

Thanks,

Ward.

using System;
using System.Collections.Generic;
using System.Linq;

namespace Linq_Test1
{
    class Email_Message
    {
        public string From;
        public string From_Address;
        public string Subject;
        public DateTime TimeRecieved;
        public string Body;
        public string Message_ID;
    }

    class Email_Group
    {
        public string From;
        public string From_Address;
        public List<String> Message_ID_List = new List<string>();
        public String Combined_Body;
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<Email_Message> message_list = new List<Email_Message>();
            List<Email_Group> group_list = new List<Email_Group>();

            Email_Message message;

            message = new Email_Message();
            message.From = "A"; message.From_Address = "a@test.com"; message.Subject = "Subject 1";
            message.TimeRecieved = DateTime.Now; message.Body = "Body A-1"; message.Message_ID = Guid.NewGuid().ToString();
            message_list.Add(message);

            message = new Email_Message();
            message.From = "A"; message.From_Address = "a@test.com"; message.Subject = "Subject 2";
            message.TimeRecieved = DateTime.Now; message.Body = "Body A-2"; message.Message_ID = Guid.NewGuid().ToString();
            message_list.Add(message);

            message = new Email_Message();
            message.From = "B"; message.From_Address = "b@test.com"; message.Subject = "Subject 3";
            message.TimeRecieved = DateTime.Now; message.Body = "Body B-1"; message.Message_ID = Guid.NewGuid().ToString();
            message_list.Add(message);

            message = new Email_Message();
            message.From = "B"; message.From_Address = "b@test.com"; message.Subject = "Subject 4";
            message.TimeRecieved = DateTime.Now; message.Body = "Body B-2"; message.Message_ID = Guid.NewGuid().ToString();
            message_list.Add(message);

            var grouped_messages = message_list.GroupBy(x => new { x.From, x.From_Address }).ToList();

            // Can the code below be converted to Linq ??
            // i.e. group_list produced via Linq.

            foreach (var group in grouped_messages)
            {
                Email_Group email_Group = new Email_Group();

                email_Group.From = group.Key.From;
                email_Group.From_Address = group.Key.From_Address;
                email_Group.Combined_Body = "\r\nCombined Body:\r\n---\r\n\r\n";
                foreach (var email_message in group)
                {
                    email_Group.Combined_Body += email_message.Body + "\r\n---r\n";
                    email_Group.Message_ID_List.Add(email_message.Message_ID);
                }
                
                email_Group.Combined_Body += "\r\n===\r\n";

                group_list.Add(email_Group);
            }

            // -------------------------------------------------
        }
    }
}

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of it_saige
it_saige
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of whorsfall

ASKER

Hi,

it_saige - big thanks great help

Thanks,

Ward