将列表中struct的成员转换为数组
本文关键字:转换 数组 成员 列表 struct | 更新日期: 2023-09-27 17:55:06
为了处理日志文件中的数据,我将数据读入一个列表。
当我试图将列表转换为用于绘图例程的数组时,我遇到了麻烦。
为了方便讨论,假设日志文件包含三个值* - x、y和theta。在执行文件I/O的例程中,我读取这三个值,将它们赋值给一个结构体,并将该结构体添加到PostureList。
绘图例程,希望x, y和在单独的数组中。我的想法是使用ToArray()方法来进行转换,但是当我尝试下面的语法时,我得到了一个错误-请参阅下面的评论中的错误。我有另一种方法来进行转换,但希望得到更好方法的建议。
我是c#的新手。提前感谢您的帮助。
注意:*实际上,日志文件包含许多不同的信息片段,它们具有不同的有效负载大小。
struct PostureStruct
{
public double x;
public double y;
public double theta;
};
List<PostureStruct> PostureList = new List<PostureStruct>();
private void PlotPostureList()
{
double[] xValue = new double[PostureList.Count()];
double[] yValue = new double[PostureList.Count()];
double[] thetaValue = new double[PostureList.Count()];
// This syntax gives an error:
// Error 1 'System.Collections.Generic.List<TestNameSpace.Test.PostureStruct>'
// does not contain a definition for 'x' and no extension method 'x' accepting a first
// argument of type 'System.Collections.Generic.List<TestNameSpace.Test.PostureStruct>'
// could be found (are you missing a using directive or an assembly reference?)
xValue = PostureList.x.ToArray();
yValue = PostureList.y.ToArray();
thetaValue = PostureList.theta.ToArray();
// I could replace the statements above with something like this but I was wondering if
// if there was a better way or if I had some basic mistake in the ToArray() syntax.
for (int i = 0; i < PostureList.Count(); i++)
{
xValue[i] = PostureList[i].x;
yValue[i] = PostureList[i].y;
thetaValue[i] = PostureList[i].theta;
}
return;
}
ToArray
的扩展方法只能在IEnumerable
s上使用。要转换一个IEnumerable
,例如从你的结构到一个单一的值,你可以使用Select
扩展方法。
var xValues = PostureList.Select(item => item.x).ToArray();
var yValues = PostureList.Select(item => item.y).ToArray();
var thetaValues = PostureList.Select(item => item.theta).ToArray();
您不需要定义数组的大小或使用new
创建它们,扩展方法将处理这些
您试图直接在列表中引用x。
PostureList.y
你需要在特定的成员上做,比如
PostureList[0].y
我猜你需要从你的列表中选择所有的x。你可以这样做
xValue = PostureList.Select(x => x.x).ToArray();
您可以使用这种方式将List<PostureStruct>
转换为单独的数组:
double[] xValue = PostureList.Select(a => a.x).ToArray();
double[] yValue = PostureList.Select(a => a.y).ToArray();
double[] thetaValue = PostureList.Select(a => a.theta).ToArray();
这就是你所要做的,数组将具有正确的大小(与列表的长度相同)。
您可以在列表中循环:
double[] xValue = new double[PostureList.Count()];
double[] yValue = new double[PostureList.Count()];
double[] thetaValue = new double[PostureList.Count()];
foreach (int i = 0; i < PostureList.Count; ++i) {
xValue[i] = PostureList[i].x;
yValue[i] = PostureList[i].y;
thetaValue[i] = PostureList[i].theta;
}
...
或者使用Linq,但是以不同的方式:
double[] xValue = PostureList.Select(item => item.x).ToArray();
double[] yValue = PostureList.Select(item => item.y).ToArray();
double[] thetaValue = PostureList.Select(item => item.theta).ToArray();
...