#c# #list #linq #c#-4.0 #linq-to-entities
Вопрос:
Я новичок в программировании, и мне было интересно, можно ли объединить 3 разные таблицы в их индексе в один результат запроса. Или, если объединение с помощью LINQ невозможно, я могу создать один новый список, состоящий из данных 3 списков.
(Ps. содержимое списка будет введено пользователем, и количество элементов может изменяться от запуска к запуску, но количество элементов в списке всегда будет одинаковым)
Это 3 списка:
List<string> SelfStudyModuleName = new List<string>();
public List<double> SelfStudySesionHours = new List<double>();
public List<DateTime> 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]=2021/12/01;
SelfStudySesiondate[1]=2021/12/02;
SelfStudySesiondate[2]=2021/12/03;
SelfStudySesiondate[3]=2021/12/04;
Образец желаемого результата:
2021/12/01 Prog 2
2021/12/02 Cloud 5
2021/12/03 DataBase 3
2021/12/04 Geo 6
Ответ №1:
Если вы не хотите создавать еще один класс, вы можете сделать это таким образом. В противном случае смотрите ответ @Serge
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] );
}
Ответ №2:
попробуйте это
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]
});
}
}
класс
public class SelfStudy
{
public DateTime SelfStudySesiondate { get; set; }
public string SelfStudyModuleName { get; set; }
public double SelfStudySesionHours { get; set; }
}
и добавьте SelfStudySesiondate0 для вашей инициализации
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();
Комментарии:
1. большое вам спасибо, это очень помогло.
2. @DominiqueParkin Добро пожаловать!
Ответ №3:
Кортеж<строка,int,дата-время> тоже может помочь. если вы хотите избежать использования классов, просто используйте вместо этого этот. результат var = новый кортеж<строка,int,дата и время>();
for (var i = 0; i < SelfStudyModuleName.Count; i )
{
result.Add(new SelfStudy
{
SelfStudyModuleName[i],SelfStudySesionHours[i],SelfStudySesiondate[i]
});
}
}
Ответ №4:
Оператор LINQ Zip
может быть тем, что вы ищете:
var results = SelfStudyModuleName.Zip(SelfStudySesionHours, (moduleName, sessionHours) => new { moduleName, sessionHours })
.Zip(SelfStudySesiondate, (e, date) => new { e.moduleName, e.sessionHours, date});
Хотя, если у вас есть возможность индексировать источники (как в случае со списком/массивом), вы можете сделать что-то вроде этого:
var results2 = SelfStudyModuleName
.Select((moduleName, i) => new {
moduleName,
sessionHours = SelfStudySesionHours[i],
date = SelfStudySesiondate[i]
});
Комментарии:
1. большое вам спасибо за помощь, это тоже сработало, но другой ответ лучше работает в моей программе.