2013-08-08 1 views
1

У меня есть список 3D-данных внутри списка, а именно c_TopКак сделать цикл сортировки и списка обновлений <> на основе конкретных условий

c_Top список состоит из узора, где он заказывает значение у в убывающем порядок, и это было что-то вроде ниже:

//[ 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] 

Теперь моя цель состоит в том, чтобы получить все й значение внутри списка c_Top на основе условия, где он имеет такое же значение г

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 
     } 
} 

Я использую приведенный выше цикл цикла и приведенный выше пример данных. По причине 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 списка имеет тот же г как c_Top[i].p.Z, то она будет проверять все й значение внутри c_Top списка.

Если есть значение х больше c_Top[i].p.X, то х будет добавлено в xy_xplusList

Если есть значение х меньше c_Top[i].p.X, то х будет добавлено в xy_minusList

Есть некоторые LINQ пути на Делать это?

Нечто подобное после того, как я вроде с таким же г, проверьте все х внутри списка, и добавить к xy_xplusList

Пояснение Обновление

В каждой из координат в списке, сначала я проверить их в том же поле Z или нет. Если они такие же Z поле, то я проверяю все X.

Если X больше, чем координата текущих х, а затем добавить к х xplusList

Если X меньше координат текущих х, затем добавить x в xminusList

* Повторяю описанный выше процесс для всей координаты внутри списка.

Объяснение Update2

enter image description here enter image description here визуализации, что кончик пирамиды многоугольника выше является одна координата в списке c_Top

Чтобы нарисовать пирамиду многоугольник, нам нужны координаты TIP, то координаты RHS от наконечника и координаты LHS от наконечника, координаты FRONT и координаты со спины.

Итак, вернемся к вопросу. Я сохранил несколько TIP-координат внутри списка c_Top. Теперь я хочу проверить все координаты в RHS от наконечника (в направлении + X), а также LHS от наконечника (в направлении -X). То же самое для координат FRONT и BACK.

Imaging, что у меня есть несколько TIP-координат, расположенных в одном и том же поле Z с разной высотой. Я хочу, чтобы соединен все кончике вместе относительно самой высокой кончике координат, как показывают розовый цвет линии ниже: enter image description here

Update: Ответ на вопрос сам, и этот вопрос должен быть закрыт

//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); 
     } 
    } 

} 
+0

Я не после ваш вопрос. вы запрашиваете подмножество списка, где одно и то же значение находится в полях X и Z? –

+0

Мне тоже сложно нести этот вопрос. В том же Z-файле я хочу проверить все X, погода больше, чем текущий X или меньше, чем текущий X. Я отредактирую и обновляю вопрос, когда я подумайте о правильном способе объяснить это. – jhyap

+0

Можете ли вы немного рассказать о своей цели, в терминах или результатах, а не о решении, в надежде, что это прояснит проблему? – Michael

ответ

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); 
     } 
    } 
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(); 
    } 
} 
Смежные вопросы