Reputation: 33
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
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});
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]
});
Upvotes: 0
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
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
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