Как я могу использовать LINQ с классом, который имеет параллельные массивы?


Я недавно начал использовать LINQ в своем коде. Я работаю с классом TimeSeries, который выглядит следующим образом:

public struct TimeSeriesFloat
{
    public DateTime[] DateTime;
    public float[] Value;
}

Я хочу иметь возможность использовать LINQ для сортировки по "значению" и чтобы массив DateTime также сортировался таким образом, чтобы поддерживать отображение 1:1 между DateTime[i] и Value[i].

Я попытался реализовать IEnumerator в классе для запуска, но я даже не смог заставить его работать без ошибок. Поэтому я отступил назад и спросил себя, стоит ли оно того. это делается потому, что невозможно выполнить сортировку по одному массиву, а также параллельно отсортировать другой массив, который поддерживает отображение.

Возможно ли это?

EDIT: WOOPS! Мое извинение. В спешке я назвал это классом. Это структура. :)

1 3

1 ответ:

Как упоминалось в комментариях, я бы вместо этого класс TimeSeries, который содержит DateTime и float:

public struct TimeSeries
{
  public DateTime DateTime;
  public float Value;
}

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

Если по какой-либо причине вы должны начать со структуры, которую вы имеете, то вы могли бы превратить ее в IEnumerable, как это:

var tsf = timeSeriesFloat.DateTime
    .Zip(tsf.Value, (f, s) => new {DateTime=f,Value=s});

Это создало бы IEnumerable. Затем вы можете сказать Сортировать по значению:

Var sortedByValue = tsf.OrderBy (x = > X. Value);

И вы можете делать другие виды операций Linq на нем, и если вы хотите, вы можете создать новый TimeSeriesFloat с вашим сортированным (фильтрованным, ...) данные.