将列表中struct的成员转换为数组

时间:2014-03-31 05:21:26

标签: c# list struct toarray

为了处理日志文件中的数据,我将数据读入列表。

当我尝试从列表转换为图形例程的数组时,我遇到了麻烦。

为了便于讨论,我们假设日志文件包含三个值* - x,y和theta。在执行文件I / O的例程中,我读取了三个值,将它们分配给结构并将结构添加到PostureList。

绘图程序,希望x,y和theta位于各个数组中。我的想法是使用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;
}

4 个答案:

答案 0 :(得分:2)

ToArray扩展方法只能在IEnumerable上使用。要转换 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创建数组,扩展方法将处理此问题。

答案 1 :(得分:0)

您正试图直接在列表中引用x。

PostureList.y

您需要在特定成员上执行此操作,例如

PostureList[0].y

我猜您需要从列表中选择所有x。为此你可以做到这一点

xValue = PostureList.Select(x => x.x).ToArray();

答案 2 :(得分:0)

您可以使用这种方式将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();

这就是你所要做的,数组的大小合适(与列表的长度相同)。

答案 3 :(得分:0)

您可以通过列表循环

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