1

我在列表中有一个 3D 数据列表,即c_Top

c_Top列表包含一个模式,它按降序排列 y 值,如下所示:

//[ x,  y, z]      
  [ 2, 10, 1] //c_Top[0]
  [ 7,  8, 1] //c_Top[1]
  [ 1,  7, 2] //c_Top[2]
  [ 3,  6, 1] //c_Top[3]
  [ 4,  6, 2] //c_Top[4]
  .               .   
  .               . 
  .           //c_Top[cTop.Count - 1]

现在,我的目标是根据具有相同 z 值的条件获取 c_Top 列表中的所有 x 值

for (int i = 0; i < c_Top.Count; i++)
{
    if (i != c_Top.Count - 1)
    {
        // if the next data and the current data has same z, then proceed
        if (c_Top[i].p.Z == c_Top[i + 1].p.Z)
        {
            // if the x of next data is greater than current x of current data
            if (c_Top[i + 1].p.X > c_Top[i].p.X)
            {
                // Select all the x and y value at X+ direction
                xy_xplusList = c_Top.Select(x => x.p.X).OrderBy(x => x).ToList();
            }

            // if the x of next data is smaller than current x of current data
            else if (c_Top[i + 1].p.X < c_Top[i].p.X)
            {
                // Select all the x and y value at X- direction
                xy_xminusList = c_Top.Select(x => x.p.X).OrderByDescending(x => x).ToList();
            }
        }

        if (xy_xplusList.Count > 0)
        {
              //Do something
        }

        if (xy_xminusList.Count > 0)
        {
              //Do something
        }
}

我正在使用上面的 for 循环和上面的数据示例。由于 的原因c_Top[1]c_Top[2]具有不同的 z 值。因此,当i = 1,the c_Top[1].p.X即使它具有与c_Top[0]

我得到这样的结果

//Output
xy_xplusList  =  { 2 } //only one x values from  c_Top[0] is saved
xy_xminusList =  { 0 }

但实际上我想要的结果是这样的

c_Top[0] // Output xy_xplusList = { 2, 3 } 
         //       xy_xminusList = { 0 }

c_Top[1] // Output xy_xplusList = { 0 }
         //       xy_xminusList = { 3 }

c_Top[2] // Output xy_xplusList  = { 1 , 4 }
         //        xy_xminusList = { 0 }

c_Top[3] // Ouput xy_xplusList  = { 7 }
         //       xy_xminusList = { 2 }

c_Top[4] // Ouput xy_xplusList  = { 0 }
         //       xy_xminusList = { 1 }

简而言之。我想考虑c_Top列表中的每个数据。

考虑时c_Top[i]

如果c_Top列表中 z 值的所有数据与 具有相同的 z c_Top[i].p.Z,则它将检查c_Top列表中的所有 x 值。

如果 x 值大于c_Top[i].p.X,则 x 将被添加到xy_xplusList

如果得到的 x 值小于c_Top[i].p.X,则 x 将被添加到xy_minusList

有一些 LINQ 方法吗?

就像我用相同的 z 排序后,检查列表中的所有 x,然后添加到xy_xplusList

说明更新

在列表中的每个坐标中,首先我检查它们是否在同一个 Z 字段中。如果它们是相同的 Z 字段,那么我检查所有 X。

如果 X 大于当前 x 坐标,则将 x 添加到 xplusList

如果 X 小于当前 x 坐标,则将 x 添加到 xminusList

*我对列表内的所有坐标重复上述过程。

说明更新2

在此处输入图像描述 在此处输入图像描述 想象上面的金字塔多边形的尖端是c_Top列表中的一个坐标

要绘制金字塔多边形,我们需要 TIP 的坐标、RHS 的尖端坐标和 LHS 的尖端坐标、FRONT 的坐标和背面的坐标。

所以,现在,回到问题。我在 c_Top 列表中存储了多个 TIP 坐标。现在我想从尖端(+X 方向)检查 RHS 中的所有坐标,以及从尖端(-X 方向)检查 LHS 中的所有坐标。FRONT 和 BACK 坐标也是如此。

成像我有多个 TIP 坐标排列在不同高度的同一 Z 字段中。我想将所有尖端相对于最高尖端坐标连接在一起,如下面的粉红色线所示: 在此处输入图像描述

更新:自己回答这个问题,这个问题将被关闭

//Group all the Z coordinate throughout the v_Tip list
var groupedZ = from p in v_Tip
               group p by p.p.Z into q
               select q;

foreach (var groupZ in groupedZ)
{
    //Order the groupZ with Y coordinate descending order
    var SameZList = groupZ.OrderByDescending(y => y.p.Y).ThenBy(x => x.p.X).ToList();

    //Since the list is order by descending w.r.t Y coordinate, the SameZList[0] will be the peak coordinate in groupZ
    var peakZ = SameZList[0];

    // At same Z, mean at XY plane
    for (int i = 1; i < SameZList.Count; i++)
    {
        // mean the x is at the RHS from the peak
        if (peakZ.p.X < SameZList[i].p.X)
        {
            // add all the X and Y coordinates in RHS direction from the peak (X+ direction from the peak
            xy_xplusList.Add(SameZList[i].p.X);
            xy_yplusList.Add(SameZList[i].p.Y);
        }
        else // the x is at the LHS from the peak
        {
            // add all the X and Y coordinates in LHS direction from the peak (X- direction from the peak
            xy_xminusList.Add(SameZList[i].p.X);
            xy_yminusList.Add(SameZList[i].p.Y);
        }
    }

}
4

2 回答 2

1

我不确定我是否 100% 回答您的问题……但这对您有什么用?

    public void DoWork(List<int[]> c_Top)
    {
        var distinctZvalues = c_Top.Select(p => p[2]); // this gets an enumerable object of unique Z values

        List<int[]> xy_minus = new List<int[]>();
        List<int[]> xy_plus = new List<int[]>();

        foreach (var z in distinctZvalues)
        {
            List<int[]> coords = c_Top.Where(p => p[2] == z).ToList(); // pull all int[] from c_Top where z == z
            foreach (int[] coord in coords)
                if (coord[0] > coord[1])
                    xy_minus.Add(coord);
                else
                    xy_plus.Add(coord);
        }
    }

或者,经过进一步审查,您可能正在寻找基于 Z 值的唯一列表...

public void DoWork2(List<int[]> c_Top)
    {
        var distinctZvalues = c_Top.Select(p => p[2]); // this gets an enumerable object of unique Z values

        Dictionary<int, List<int[]>> xy_minus = new Dictionary<int, List<int[]>>();
        Dictionary<int, List<int[]>> xy_plus = new Dictionary<int, List<int[]>>();

        foreach (var z in distinctZvalues)
        {
            List<int[]> minus = new List<int[]>();
            List<int[]> plus = new List<int[]>();
            List<int[]> coords = c_Top.Where(p => p[2] == z).ToList(); // pull all int[] from c_Top where z == z
            foreach (int[] coord in coords)
                if (coord[0] > coord[1])
                    minus.Add(coord);
                else
                    plus.Add(coord);
            xy_minus.Add(z, minus);
            xy_plus.Add(z, plus);
        }
    }
于 2013-08-08T02:03:53.653 回答
0

如果我没有误解你的问题

 class Program
{
    static void Main(string[] args)
    {
        List<int[]> c_top=new List<int[]>();
        c_top.Add(new int[3]{ 2, 10, 1});
        c_top.Add(new int[3]{ 7,  8, 1});
        c_top.Add(new int[3]{ 2,  7, 2});
        c_top.Add(new int[3]{ 3,  6, 1});
        c_top.Add(new int[3]{  4,  6, 2});

        var result=c_top.Where(x => x[0] == x[2]).Select(s => s[0]).ToList();
    }
}
于 2013-08-08T04:03:27.630 回答