структура данных (или массив) {XYZ} — если X отличается и Y удовлетворяет условиям, вычислить с Z?

Имея много проблем с выяснением этого, и оцените любые намеки (LINQ, возможно?).

У меня есть структура данных из списка строк CSV

data[i].X = Convert.ToSingle(dataList[0]);
data[i].Y = Convert.ToSingle(dataList[1]);
data[i].Z = Convert.ToSingle(dataList[2]);

Данные из изображения, поэтому каждый X имеет много Y (с соответствующим Z), например:

X: 0 0 1 1 2 2
Y: 0 1 0 1 0 1
Z: 1 2 3 2 1 0

Мне нужно найти все значения Z, которые соответствуют различному X (где Y будет между определенными значениями). Я преобразовал структуру данных в двойной массив для выполнения некоторых математических операций, поэтому я попытался

distData[0] = distTemp[0].Distinct().ToArray();
for (int i = 0; i < data.Length; i++)
        {
            for (int j = 0; j < distData.Length; j++)
            { 
                if (data[i].Y > 0 && data[i].Y < 2 && data[i].X == dist[0][j])
                    dist[0][i] = data[i].Z;
            }
        }

это работает, но теперь у меня нет ни малейшего представления о том, как работать с данными, которые мне дают. Мне возвращается то, что я должен ожидать, а именно огромный массив (данных.Length), которая имеет некоторые 0 значений, то группа значений Z (когда выполняются условия), то 0, и так далее.

0 0 0 0 Z Z Z Z Z 0 0 0 Z Z Z Z 0 0 0 0 0 Z Z...

Что мне нужно сделать, так это сгруппировать ненулевые данные, поэтому для Выше я хочу » усреднить первую группу Z, игнорировать следующие 0, усреднить следующую группу Z…»таким образом, я получаю среднее значение Z (и другие вычисления) для каждого уникального значения X, которое соответствует условиям значения Y.

У меня нет идей, как сделать эту логику, и кажется, из самого базового LINQ, который я использовал на своей структуре данных (я очень новичок в LINQ), что может быть лучший способ, чем много итераций массива — предполагая, что я даже могу понять логику итерации.

спасибо

1 ответ

  1. Если вы не хотите собирать nиз nдоступных значений, то использование массива размера nи только заполнение значений, которые вы хотите собрать, кажется плохой идеей. Потому что это именно то , что вы делаете с dist[0]: КаждыйZ, который должен быть собран, получает набор своего индекса at dist[0][i]; для всех другихZ, вы не изменяете значение массива.

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

    var values = new List<int>();
    for (int i = 0; i < data.Length; i++)
    {
        if (condition(data[i].Y))
            values.Add(data[i].Z);
    }
    

    После этого, valuesбудет содержать все теZ, для которых условие на Yбыло успешным. Конечно, это резко меняет то, как будет выглядеть полученная структура данных, удаляясь от структуры входных данных, но это то, что вы должны сделать: взять входные данные и преобразовать их так, как вам нужно.

    И затем, это также довольно просто выразить, что с LINQ:

    var values = data.Where(d => condition(d.Y))
                     .Select(d => d.Z)
                     .ToList();