不确定我问这个权利还是这个甚至可能.我想解释一下我的问题,最好在相关地方的代码中询问,所以请在下面的代码段中查看我的评论.
我想知道如何在不为每个迭代构建一个新的值列表的情况下实现这一点.我觉得这不应该是必要的.
该循环的更大图景是将3D点的各个维度绘制为这些的三个新2D图.希望有道理.
for (int i = 0; i < 3; i++) // 3 iterations (X,Y;Z)
{
// what here? how to make the data component of Vector3D a variable
for (int k = 0; k <= Points.Count - 1; k++)
{
Vector2D TL = new Vector2D();
TL.x = ((1 / (float)FrameCount.Sum()) * k);
TL.y = Points[k].x; // on i = 0 want Points[k].x
// on i = 1 want Points[k].y
// on i = 2 want Points[k].z
TimelinePoints.Add(TL); // just collect to a flat list for now
}
}
Run Code Online (Sandbox Code Playgroud)
一种选择是拥有一组可应用于点的提取函数。Select然后,您可以使用接受 a 的LINQ重载Func<TInput, int, TOutput>来生成要添加的值的序列,并以TimeLinePoints这种方式添加它。
// Possibly store this in a static variable somewhere
var extractors = new Func<Point, float>[] { p => p.x, p => p.y, p => p.z };
// Just do this once; store the result as a float for simplicity when dividing later.
float frameSum = FrameCount.Sum();
foreach (var extractor in extractors)
{
TimeLinePoints.AddRange(Points.Select((point, index) =>
new Vector2D(index / frameSum, extractor(point));
}
Run Code Online (Sandbox Code Playgroud)
(你可以进一步使用SelectMany潜在的,但这就是我开始的地方......)