Объединение 3 списка в 1 запрос LINQ C#

#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]
    });
 

Пример LINQPad

Комментарии:

1. большое вам спасибо за помощь, это тоже сработало, но другой ответ лучше работает в моей программе.