问题描述
我有一个数据表 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());
}
}
}
这是我的 polyzone 类的片段:
public class polyZone
{
public string polyZoneName;
List<Point3D> pointList = new List<Point3D>(0);
Point3D polyCenter = new Point3D(0,0);
public polyZone(string zoneName)
{
polyZoneName = zoneName;
}
public void add(Point3D point3D)
{
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;
}
这是我测试它的方式:
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());
}
}
}
带有区域名称的第一个 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);
public PolyZone(string zoneName)
{
polyZoneName = zoneName;
}
public void add(Point3D point3D)
{
pointList.Add(point3D);
}
}