在 C# 中初始化具有单维和 3 个元素的 List<Double[]>



我尝试了很多教程,但在这种情况下似乎没有一个有效。我需要一个List<Double[3]>但似乎无法想出正确的语法。我试过:

List<double[]> points = new List<double> {0.0, 0.0, 0.0 };
List<double[3]> points = new List<double> {0.0, 0.0, 0.0 };
List<double[]> points = new List<double[]> {};

稍后我正在做:

pointDouble[0] = Convert.ToDouble(pointString[0]);
pointDouble[1] = Convert.ToDouble(pointString[1]);
pointDouble[2] = Convert.ToDouble(pointString[2]);
points.Add(pointDouble);

如果我让初始化正常工作,那么当我尝试将pointDouble[]添加到列表中时,我会得到不匹配。通常double[]无法转换为Double的消息。

如果你想要一个双精度的三元组列表,请考虑创建一个将容纳 3 个双精度的对象。这为您的代码提供了一些语义含义,更易于阅读,并防止您错误地将 4 或 5 个双精度数组添加到列表中。例如,如果您尝试存储 3D 坐标,则可能有以下内容:

public class Coordinate
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
}

并改为列出此类:

var coords = new List<Coordinate>();

这意味着你也可以在类上有一个很好的构造函数,例如:

public Coordinate(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}

将新项目添加到列表中既好又容易:

coords.Add(new Coordinate(1, 2, 3));

对列表使用泛型集合参数 T,因为您无法强制项目数保持一致/常量是自找麻烦的。(double[3] 不是一个类型,double[] 是(。

如果您不希望类的开销来表示您的数据,并且希望确保每个项目的项数保持不变,则可以为此目的使用更轻量级的"命名内容包"ValueTuple:

var points = new List<(double x, double y, double z)>() {
(5.0, 6.0, 7.0)
};
points.Add((1.0, 2.0, 3.0));
var point = points[0];
var nonsensicalSUm = point.x + point.y + point.z;

这只是一个语法问题,这非常有效:

List<double[]> points = new List<double[]> { new double[]{0.0, 0.0, 0.0 }};

在您的大多数示例中,初始值设定项甚至不是主要问题,您不能将某些内容分配给其他类型的内容,"双数组"列表不是"双精度数组"列表

List<double[]> points = new List<double> /*What happens after this point doesn't matter, you're trying to create a new list of double, and to assign it to a list of arrays, this cannot work*/ {0.0, 0.0, 0.0 };

集合初始值设定项的语法按预期工作,只是集合中只有集合,所以集合中的每个"项"都是一个也可以初始化的集合,让我们减少我的工作示例的步骤:

List<double[]> points = new List<double[]> 
{ 
// Here we are in the list initializer, we can create elements of the type expected by the list
//the list expect double ARRAYS, not doubles as you declared a List<double[]> not a List<double>
new double[]
{
// Here we are in the double[] initializer, a double[] is a collection of doubles, so we can initialize it with doubles
0.0, 0.0, 0.0 
}
};

这适用于任何数量的嵌套,无论是简单还是复杂,例如,如果您使用了像List这样疯狂的东西>>>那么您可以将其初始化为:

var MyList = new List<List<List<List<double[]>>>>
{//Fill the outer list
new List<List<List<double[]>>>
{// Fill one level down
new List<List<double[]>>
{// etc
new List<double[]>
{// and finally fill that bottom most list with a double array
new double[]
{// With however many elements you want
0.0,0.0,0.0,0.0
}
}
}
}
}

除此之外,您很可能最好不要直接使用数组,而是使用类或结构来封装您的数据,例如您提到点,如果您想要 3D 点的集合,则更容易不将每个点表示为 double[],而是表示为具有 X Y Z 属性的类:

public class Point
{
public double X {get;set;}
public double Y {get;set;}
public double Z {get;set;}
}

然后使用集合和属性初始值设定项创建它,如下所示:

var MyPoints = new List { 新点 {//在此处填写您的点的属性 X = 0.0, Y = 0.0, Z = 0.0 } };

另请注意,在您的特定情况下,您的点数为 0.0,如果您以这种方式初始化它,您可以完全跳过发起器,只执行新的 Point((,因为浮点数/双精度将默认为 0.0

相关内容