如何组合(或合并)多个复杂列表并转换为带分隔符的字符串数组;在 C#

How to combine (or merge) multiple complex Lists and convert to a string array with separator ; in C#

当我尝试通过使用 for 循环 return 具有指定分隔符的字符串数组来组合或合并多个列表时,我遇到了性能挑战; class的样本和数据结构如下图

我认为可以使用 LINQ,但我不知道该怎么做。 请指导我如何使用 LINQ 实现。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    public class DataGroup
    {
        private string _Name;
        private List<double> _ValueList;

        public DataGroup(string Name, List<double> ValueList)
        {
            _Name = Name;
            _ValueList = ValueList;
        }
        public string Name
        {
            set { _Name = value; }
            get { return (_Name); }

        }
        public List<double> ValueList
        {
            set { _ValueList = value; }
            get { return (_ValueList); }
        }

    }

    class Program
    {
        public static void Main(string[] args)
        {
            //Assume the element count of Log time will be ALWAYS same as the values of each DataGroup.
            //Sample data for test
            List<DateTime> LogTime = new List<DateTime>()
            { 
                new DateTime (2022,5,31,14,4,0), new DateTime (2022,5,31,14,4,10), new DateTime (2022,5,31,14,4,20) 
            };


            List<DataGroup> ALLData = new List<DataGroup>();

            ALLData.Add(new DataGroup("V1", new List<double>() { 1.1, 1.2, 1.3 }));
            ALLData.Add(new DataGroup("V2", new List<double>() { 2.1, 2.2, 2.3 }));
            ALLData.Add(new DataGroup("V3", new List<double>() { 3.1, 3.2, 3.3 }));
            ALLData.Add(new DataGroup("V4", new List<double>() { 4.1, 4.2, 4.3 }));
            ALLData.Add(new DataGroup("V5", new List<double>() { 5.1, 5.2, 5.3 }));

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

            string[] logtimeLsit = LogTime.Select(LT => LT.ToString("yyyy/MM/dd HH:mm:ss.fff")).ToArray();
            double [] ValueList = ALLData.SelectMany(AD=>AD.ValueList).ToArray();

            string Header = "LogTime;" + String.Join(";", ALLData.Select(AD => AD.Name).ToArray());

            int TotalRowCount=LogTime.Count;

            int TotalValueCountinEachSensor=ALLData.Count;

            DataRows.Add(Header);

            for (int Pos = 0; Pos < TotalRowCount; Pos++)
            {
                string DataRow = logtimeLsit[Pos] + ";";

                for (int inPos = 0; inPos < TotalValueCountinEachSensor; inPos++)
                {
                    int offsetPos =Pos+( inPos * TotalRowCount);
                    DataRow += ValueList[offsetPos] + ";";
                }
                DataRows.Add(DataRow.Remove(DataRow.Length - 1, 1));
            }

            Console.Write(DataRows.ToArray());
            // ToDO: Output a string array like 
            //  string [] dataRows = {
            //                          "LogTime;V1;V2;V3;V4;V5",
            //                          "2022/05/31 14:04:00;1.1;2.1;3.1;3.1;5.1",
            //                          "2022/05/31 14:04:10;1.2;2.2;3.2;3.2;5.2",
            //                          "2022/05/31 14:04:20;1.3;2.3;3.3;3.3;5.3",
            //                       };     
        }
    }
}

好了:

string[] dataRows =
    Enumerable
        .Range(0, LogTime.Count)
        .Select(n => String.Join(";", ALLData.Select(x => x.ValueList[n].ToString()).Prepend(LogTime[n].ToString("yyyy/MM/dd HH:mm:ss"))))
        .StartWith(String.Join(";", ALLData.Select(x => x.Name).Prepend("LogTime")))
        .ToArray();

这给出:

LogTime;V1;V2;V3;V4;V5
2022/05/31 14:04:00;1.1;2.1;3.1;4.1;5.1
2022/05/31 14:04:10;1.2;2.2;3.2;4.2;5.2
2022/05/31 14:04:20;1.3;2.3;3.3;4.3;5.3