将 3 个列表组合成 1 个 LINQ 查询 C#

Posted

技术标签:

【中文标题】将 3 个列表组合成 1 个 LINQ 查询 C#【英文标题】:Combining 3 list into 1 LINQ Query C# 【发布时间】:2021-11-12 16:54:32 【问题描述】:

我是编程新手,我想知道是否可以将索引上的 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();

【讨论】:

非常感谢这对您有很大帮助。 @DominiqueParkin 不客气!【参考方案3】:

元组 也可能有帮助。 如果您想避免使用类,请改用这个类。 var 结果 = 新元组();

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);

虽然如果您有能力对源进行索引(就像使用 List/Array 一样),您也可以这样做:

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

LINQPad Example

【讨论】:

非常感谢您的帮助,这也很有效,但其他答案在我的程序中效果更好。

以上是关于将 3 个列表组合成 1 个 LINQ 查询 C#的主要内容,如果未能解决你的问题,请参考以下文章

c# 用来自多个 Linq 查询的数据填充 listView

将这些查询组合成一个多表连接

将多个 SQL 查询组合成单个结果

将一个组组合成多个组而不重复

C# LINQ查询之对象

如何在linq C#中使用group by并获取记录列表[重复]