如何组合(或合并)多个复杂列表并转换为带分隔符的字符串数组;在 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
当我尝试通过使用 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