У меня есть список 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
визуализации, что кончик пирамиды многоугольника выше является одна координата в списке c_Top
Чтобы нарисовать пирамиду многоугольник, нам нужны координаты TIP, то координаты RHS от наконечника и координаты LHS от наконечника, координаты FRONT и координаты со спины.
Итак, вернемся к вопросу. Я сохранил несколько TIP-координат внутри списка c_Top. Теперь я хочу проверить все координаты в RHS от наконечника (в направлении + X), а также LHS от наконечника (в направлении -X). То же самое для координат FRONT и BACK.
Imaging, что у меня есть несколько TIP-координат, расположенных в одном и том же поле Z с разной высотой. Я хочу, чтобы соединен все кончике вместе относительно самой высокой кончике координат, как показывают розовый цвет линии ниже:
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);
}
}
}
Я не после ваш вопрос. вы запрашиваете подмножество списка, где одно и то же значение находится в полях X и Z? –
Мне тоже сложно нести этот вопрос. В том же Z-файле я хочу проверить все X, погода больше, чем текущий X или меньше, чем текущий X. Я отредактирую и обновляю вопрос, когда я подумайте о правильном способе объяснить это. – jhyap
Можете ли вы немного рассказать о своей цели, в терминах или результатах, а не о решении, в надежде, что это прояснит проблему? – Michael