如何将LINQ与具有并行数组的类一起使用?

时间:2018-08-10 23:56:21

标签: c# linq sorting ienumerator

我最近开始想在我的代码中使用LINQ。我正在使用类似如下的TimeSeries类:

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

我希望能够使用LINQ对“值”进行排序,并使DateTime数组也能够保持DateTime [i]和Value [i]之间的1:1映射。

我试图在类上实现一个IEnumerator来启动,但是我什至无法使它正常工作而不会出错。因此,我退后一步,问自己是否值得,因为可能无法对一个数组进行排序,而对另一个数组进行并行维护数组。

有可能吗?

编辑:糟糕!我很抱歉。赶紧给我上课。这是一个结构。 :)

1 个答案:

答案 0 :(得分:4)

正如评论中提到的,我改用一个拥有DateTime和float的TimeSeries类:

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

然后,您将拥有可以进行各种Linq操作的这些对象的集合(无论是数组,列表,还是任何IEnumerable)。 (这也是您从数据库中获得的数据的外观,即以成员为列的结构对单个行进行建模。)

如果出于某种原因必须从具有的结构开始,那么可以将其变成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。