2016-10-10 6 views
2

У меня есть отдельный список значений, отражающий свойства координат X, Y, Z.Создание многомерного списка

List<double> PointX; 
List<double> PointY; 
List<double> PointZ; 

Можно ли создать '3D ​​List' такие, что я бы

Point = (PointX,PointY,PointZ) 
+6

Не будет ли список 3D очков больше смысла? –

+3

Почему класс 'Coordinate' состоит из' {X, Y, Z} ', а затем список из них? – Plutonix

+3

Возможный дубликат [Многомерный список C#] (http://stackoverflow.com/questions/10184145/multidimensional-list-c-sharp) – dsolimano

ответ

3

Вы можете использовать вложенные Zip вызовы принимают значения из каждого списка:

var points = 
    PointX.Zip(PointY.Zip(PointZ, (y,z) => new {y, z}) 
      , (x, yz) => new Point(x, yz.y, yz.z)); 
1

Что около

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

List<Point3D> list = new List<Point3D>(); 
for (int i = 0; i < PointX.Count; i++) { 
    list.Add(new Point3D { X = PointX[i], Y = PointY[i], Z = PointZ[i] }); 
} 
1

Вы можете использовать список кортежей, например.

 var list = new List<Tuple<double, double, double>>(){new Tuple<double, double, double>(3, 4, 5)}; 

Мне также нравится решение rboe, но я бы подумал о том, чтобы сделать класс Point3D неизменным;

public class Point3D 
{ 
    public double X { get; private set; } 
    public double Y { get; private set; } 
    public double Z { get; private set; } 

    public Point3D(double x, double y, double z) 
    { 
     X = x; 
     Y = y; 
     Z = z; 
    } 
} 
0
var points = PointX.Zip(PointY, (x, y) => new { X = x, Y = y }) 
    .Zip(PointZ, (xy, z) => new { X = xy.X, Y = xy.Y, Z = z }); 
var point = points.First(); 
double px = point.X; 
double py = point.Y; 
double pz = point.Z; 

Вы можете использовать Zip присоединиться к 3 коллекции в анонимный тип. В этом примере я застегиваю x, y в анонимный тип, затем я застегиваю этот тип с помощью коллекции z, чтобы вернуть коллекцию анонимного типа, представляющего x, y и z.

0

Ответы на основе Zip-звука довольно хорошие. Однако вы также можете создать метод расширения для List.

что-то вроде:

public static List<double> Xs(this List<Point3D> pts) { 
     List<double> xs = new List<double>(pts.Count); 

     foreach (Point3D pt in pts) { 
      xs.Add(pt.X); 
     } 
     return xs; 
    } 

    public static List<double> Ys(this List<Point3D> pts) { 
     List<double> ys = new List<double>(pts.Count); 

     foreach (Point3D pt in pts) { 
      ys.Add(pt.Y); 
     } 
     return ys; 
    } 

    public static List<double> Zs(this List<Point3D> pts) { 
     List<double> zs = new List<double>(pts.Count); 

     foreach (Point3D pt in pts) { 
      zs.Add(pt.Z); 
     } 
     return zs; 
    } 
Смежные вопросы