Dominique Parkin
Dominique Parkin

Reputation: 33

Combining 3 list into 1 LINQ Query C#

Im new to Programming and I was wondering is it possible to join 3 different table on their index's into one query result. Or if joining using LINQ isn't an option can I create one new list the consists of the data of 3 lists.

(Ps. the contents of the list will be entered by the user and the amount of items can very from run to run but the amount of items in the list will always be the same)

These are the 3 lists:

List<string> SelfStudyModuleName = new List<string>();

public List<double> SelfStudySesionHours = new List<double>();
public List<DateTime> SelfStudySesiondate = new List<DateTime>();

Sample data of each list:

SelfStudyModuleName.Add("Prog");
SelfStudyModuleName.Add("Cloud");
SelfStudyModuleName.Add("Database");
SelfStudyModuleName.Add("Geo");

SelfStudySesionHours.Add(2);
SelfStudySesionHours.Add(5);
SelfStudySesionHours.Add(3);
SelfStudySesionHours.Add(6);

SelfStudySesiondate[0]=2021/12/01;
SelfStudySesiondate[1]=2021/12/02;
SelfStudySesiondate[2]=2021/12/03;
SelfStudySesiondate[3]=2021/12/04;

Sample of the desired out come:

2021/12/01  Prog       2
2021/12/02  Cloud      5
2021/12/03  DataBase   3
2021/12/04  Geo        6

Upvotes: 2

Views: 177

Answers (4)

StriplingWarrior
StriplingWarrior

Reputation: 156624

The LINQ Zip operator may be what you're looking for:

var results = SelfStudyModuleName.Zip(SelfStudySesionHours, (moduleName, sessionHours) => new { moduleName, sessionHours })
    .Zip(SelfStudySesiondate, (e, date) => new { e.moduleName, e.sessionHours, date});

enter image description here

Although if you have the ability to index into the sources (as you can with List/Array), you can do something like this:

var results2 = SelfStudyModuleName
    .Select((moduleName, i) => new {
        moduleName, 
        sessionHours = SelfStudySesionHours[i], 
        date = SelfStudySesiondate[i]
    });

LINQPad Example

Upvotes: 0

Serge
Serge

Reputation: 43931

try this

var result = new List<SelfStudy>();

    for (var i = 0; i < SelfStudyModuleName.Count; i++)
    {
        result.Add(new SelfStudy
        {
            SelfStudyModuleName = SelfStudyModuleName[i],
            SelfStudySesionHours = SelfStudySesionHours[i],
            SelfStudySesiondate = SelfStudySesiondate[i]
        });
    }
}

class

public class SelfStudy
{
    public DateTime SelfStudySesiondate { get; set; }
    public string SelfStudyModuleName { get; set; }
    public double SelfStudySesionHours { get; set; }
    
}

and add SelfStudySesiondate0 for your init

public string[] SelfStudySesiondate0 = new string[4];

    SelfStudySesiondate0[0] = "2021 / 12 / 01";
    SelfStudySesiondate0[1] = "2021 / 12 / 02";
    SelfStudySesiondate0[2] = "2021 / 12 / 03";
    SelfStudySesiondate0[3] = "2021 / 12 / 04";
    
    SelfStudySesiondate=SelfStudySesiondate0.Select(i=> Convert.ToDateTime( i)).ToList();

Upvotes: 0

Ownerszz
Ownerszz

Reputation: 50

If you don't want to make another class you can do it this way. Otherwise see @Serge's answer

        var SelfStudyModuleName = new List<string>();
        var SelfStudySesionHours = new List<double>();

        var SelfStudySesiondate = new List<DateTime>();
        SelfStudyModuleName.Add("Prog");
        SelfStudyModuleName.Add("Cloud");
        SelfStudyModuleName.Add("Database");
        SelfStudyModuleName.Add("Geo");

        SelfStudySesionHours.Add(2);
        SelfStudySesionHours.Add(5);
        SelfStudySesionHours.Add(3);
        SelfStudySesionHours.Add(6);

        SelfStudySesiondate[0] = new DateTime(2021, 12, 1);
        SelfStudySesiondate[1] = new DateTime(2021, 12, 2);
        SelfStudySesiondate[2] = new DateTime(2021, 12, 3);
        SelfStudySesiondate[3] = new DateTime(2021, 12, 4);
        var combined = new List<(string Name, double Hours, DateTime Date)>();
        for (int i = 0; i < SelfStudyModuleName.Count; i++)
        {
            combined[i] = ( Name: SelfStudyModuleName[i], Hours: SelfStudySesionHours[i], Date: SelfStudySesiondate[i] );
        }

Upvotes: 1

Bechir Anoir Chabchoub
Bechir Anoir Chabchoub

Reputation: 185

A tuple<string,int,DateTime> may help too. if you want to avoid using classes, just use this one instead. var result = new tuple<string,int,DateTime>();

for (var i = 0; i < SelfStudyModuleName.Count; i++)
{
    result.Add(new SelfStudy
    {
        SelfStudyModuleName[i],SelfStudySesionHours[i],SelfStudySesiondate[i]
    });
}

}

Upvotes: 0

Related Questions