Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从命名坐标的数据表构建二维多边形列表_C#_List_Datatable_Nested_Polygon - Fatal编程技术网

C# 从命名坐标的数据表构建二维多边形列表

C# 从命名坐标的数据表构建二维多边形列表,c#,list,datatable,nested,polygon,C#,List,Datatable,Nested,Polygon,我有一个数据表zct(分区/多边形坐标表),其列定义如下: private void buildZoneDataTable() { // Add columns to the DataTable. zct.Columns.Add("Zone Name", System.Type.GetType("System.String")); zct.Columns.Add(&qu

我有一个数据表zct(分区/多边形坐标表),其列定义如下:

private void buildZoneDataTable()
        {
            // Add columns to the DataTable.
            zct.Columns.Add("Zone Name", System.Type.GetType("System.String"));
            zct.Columns.Add("X_Coordinate", System.Type.GetType("System.Double"));
            zct.Columns.Add("Y_Coordinate", System.Type.GetType("System.Double"));
            coordDGV.DataSource = zct;
            foreach (DataGridViewColumn dgvcol in coordDGV.Columns)
            {
                dgvcol.SortMode = DataGridViewColumnSortMode.NotSortable;
            }
zct的每一行都是稍后渲染的多边形顶点的坐标,但现在我的目标是拥有所有命名分区/多边形及其多边形坐标的嵌套列表

到目前为止,我已经创建了一个多边形区域:

        private void BuildZoneList()
        {
            //iterate through all rows of the zct
            for (int i = 0; i < zct.Rows.Count; i++)
            {
                //if first row, or row I has a different name start new zone
                if(i == 0 || zct.Rows[i][0] != zct.Rows[i-1][0])
                {
                //create new polyzone named by the first column 
                 PolyZone pZone = new PolyZone(zct.Rows[i][0].ToString());
                }           
            }
        }
private void buildZonelList()
{
//迭代zct的所有行
对于(int i=0;i
下面是我的polyzone类的一个片段:

    public class PolyZone
    {

        public string polyZoneName;
        List<Point3D> pointList = new List<Point3D>(0);
        Point3D polyCenter = new Point3D(0,0,0);

        public PolyZone(string zoneName)
        {
            polyZoneName = zoneName;
        }

        public void add(Point3D point3D)
        {
            pointList.Append(point3D);

        }
公共类多区域
{
公共字符串聚苯胺;
列表点列表=新列表(0);
Point3D多中心=新的Point3D(0,0,0);
公共多区域(字符串区域名称)
{
polyZoneName=zoneName;
}
公共空白添加(点3D点3D)
{
pointList.Append(point3D);
}
编辑:多亏了jdweng的回答,我能够从列表中获取区域名称,但我在获取要添加到列表中的点时遇到了困难。下面是我如何重写BuildZoneList方法的:

        public List<PolyZone> BuildZoneList()
        {
            var zones = zct.AsEnumerable().GroupBy(x => x.Field<string>("Zone")).ToList();
            List<PolyZone> listOfPolyZones = new List<PolyZone>();
            foreach(var zone in zones)
            {
                PolyZone newZone = new PolyZone(zone.Key);
                listOfPolyZones.Add(newZone);

                foreach(DataRow row in zone)
                {
                    double x = row.Field<double>("X_Coordinate");
                    double y = row.Field<double>("Y_Coordinate");
                    double z = ZoneyRender.elevation;
                    newZone.Add(new Point3D(x,y,z));
                }

            }
            return listOfPolyZones;
        }
公共列表BuildZonelList()
{
var zones=zct.AsEnumerable().GroupBy(x=>x.Field(“Zone”)).ToList();
List listOfPolyZones=新列表();
foreach(区域中的var区域)
{
PolyZone newZone=新的PolyZone(zone.Key);
添加(newZone);
foreach(区域中的数据行)
{
双x=行字段(“x_坐标”);
双y=行字段(“y_坐标”);
双z=ZoneyRender.elevation;
添加(新点3d(x,y,z));
}
}
多功能区的返回列表;
}
下面是我测试它的方法:

private void listZonesAndCoordsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            List<PolyZone> listOfPolyZones = BuildZoneList();
            foreach(PolyZone zone in listOfPolyZones)
            {
                MessageBox.Show("Zone:" + zone.polyZoneName);
                foreach(Point3D p3d in zone.pointList)
                {
                    MessageBox.Show("Zone:" + zone.polyZoneName + Environment.NewLine + p3d.ToString());
                }
            }
        }
private void ListZones和CoordsToolStripMenuItem\u单击(对象发送者,事件参数e)
{
listOfPolyZones=BuildZoneList();
foreach(多边形区域列表中的多边形区域)
{
MessageBox.Show(“Zone:+Zone.polyZoneName”);
foreach(区域中的点3D p3d.pointList)
{
Show(“Zone:+Zone.polyZoneName+Environment.NewLine+p3d.ToString());
}
}
}
第一个带区域名称的mbox显示得很好,但是应该显示坐标的mbox从来没有出现过,这让我觉得列表是空的。有什么我遗漏的吗? 谢谢!

请尝试以下内容:

   class Program
    {
       static void Main(string[] args)
        {
           DataTable zct = new DataTable();
           zct.Columns.Add("Zone Name", System.Type.GetType("System.String"));
           zct.Columns.Add("X_Coordinate", System.Type.GetType("System.Double"));
           zct.Columns.Add("Y_Coordinate", System.Type.GetType("System.Double"));
           zct.Columns.Add("Z_Coordinate", System.Type.GetType("System.Double"));

           var zones = zct.AsEnumerable().GroupBy(x => x.Field<string>("Zone Name")).ToList();
           List<PolyZone> polyZones = new List<PolyZone>();
           foreach (var zone in zones)
           {
               PolyZone newZone = new PolyZone(zone.Key);
               polyZones.Add(newZone);

               foreach (DataRow row in zone)
               {
                   double x = double.Parse(row.Field<string>("X_Coordinate"));
                   double y = double.Parse(row.Field<string>("Y_Coordinate"));
                   double z = double.Parse(row.Field<string>("Z_Coordinate"));
                   newZone.add(new Point3D(x, y, z));
               }
           }


        }
 
    }
    public class PolyZone
    {

        public string polyZoneName;
        List<Point3D> pointList = new List<Point3D>(0);
        Point3D polyCenter = new Point3D(0, 0, 0);

        public PolyZone(string zoneName)
        {
            polyZoneName = zoneName;
        }

        public void add(Point3D point3D)
        {
            pointList.Add(point3D);

        }
    }
类程序
{
静态void Main(字符串[]参数)
{
DataTable zct=新DataTable();
添加(“区域名称”,System.Type.GetType(“System.String”);
添加(“X_坐标”,System.Type.GetType(“System.Double”);
添加(“Y_坐标”,System.Type.GetType(“System.Double”);
添加(“Z_坐标”,System.Type.GetType(“System.Double”);
var zones=zct.AsEnumerable().GroupBy(x=>x.Field(“区域名称”)).ToList();
列表多区域=新列表();
foreach(区域中的var区域)
{
PolyZone newZone=新的PolyZone(zone.Key);
polyZones.Add(newZone);
foreach(区域中的数据行)
{
double x=double.Parse(行字段(“x_坐标”);
double y=double.Parse(行字段(“y_坐标”);
double z=double.Parse(行字段(“z_坐标”);
添加(新点3d(x,y,z));
}
}
}
}
公共类多功能区
{
公共字符串聚苯胺;
列表点列表=新列表(0);
Point3D多中心=新的Point3D(0,0,0);
公共多区域(字符串区域名称)
{
polyZoneName=zoneName;
}
公共空白添加(点3D点3D)
{
pointList.Add(point3D);
}
}

你的问题是什么?@JonasH,对不起,你的评论飞过我的头,你能帮我把它哑下来吗?这里没有SQL。啊,对不起,我假设数据源来自数据库,如果不是,你可以忽略我的评论。谢谢你的帮助,但这只让我走了一半,你能检查我的编辑吗?谢谢!将数据添加到数据表中(不是DataGridView)。您的编辑与上面的代码不同。