编程语言
首页 > 编程语言> > c#-时间序列的“加入”

c#-时间序列的“加入”

作者:互联网

我正在设计一个用于处理时间序列数据的简单内部框架.
鉴于LINQ是我目前的玩具锤,我想用它敲打一切.

我想在类TimeSeries中实现方法(Select(),Where()等),以便可以使用LINQ语法来处理时间序列数据

有些事情是直截了当的,例如(从A中的x选择x 10),给出一个新的时间序列.

组合两个或多个时间序列的最佳语法设计是什么?
(从A中的A从B中的b选择a)不是很大,因为它表示嵌套循环.
也许加入?这应该对应于隐式时间变量上的join.
(我的想法对应于Lisp的“ zip”功能)

编辑:一些澄清是必要的.

时间序列是一种取决于时间的函数,例如股票报价.
时间序列的组合可能是两个股票价格之间的时间差.

Stock1.MyJoin(Stock2, (a,b)=>a-b)

可能,但是可以使用LINQ语法将其整洁地表达吗?
我希望自己在类MyTimeSeries中实现LINQ方法.

解决方法:

如果我对问题的理解正确,您是否要根据多个序列在序列中的位置来加入它们?

System.Linq.Enumerable类中没有任何东西可以执行此操作,因为Join和GroupJoin方法都基于联接键.但是,碰巧的是,几天前我为此目的编写了一个PositionalJoin方法,如您的示例中所使用的:

sequenceA.PositionalJoin(sequenceB, (a, b) => new { a, b });

下面显示的方法的语义是它不需要序列的长度相等,但是修改序列以要求它是微不足道的.我还注释了使用内部帮助程序类进行参数检查的位置.

public static IEnumerable<TResult> PositionalJoin<T1, T2, TResult>(
    this IEnumerable<T1> source1, 
    IEnumerable<T2> source2, 
    Func<T1, T2, int, TResult> selector)
{
    // argument checking here
    return PositionalJoinIterator(source1, source2, selector);
}

private static IEnumerable<TResult> PositionalJoinIterator<T1, T2, TResult>(
    IEnumerable<T1> source1, 
    IEnumerable<T2> source2, 
    Func<T1, T2, TResult> selector)
{
    using (var enumerator1 = source1.GetEnumerator())
    using (var enumerator2 = source2.GetEnumerator())
    {
        bool gotItem;
        do
        {
            gotItem = false;

            T1 item1;
            if (enumerator1.MoveNext())
            {
                item1 = enumerator1.Current;
                gotItem = true;
            }
            else
            {
                item1 = default(T1);
            }

            T2 item2;
            if (enumerator2.MoveNext())
            {
                item2 = enumerator2.Current;
                gotItem = true;
            }
            else
            {
                item2 = default(T2);
            }

            if (gotItem)
            {
                yield return selector(item1, item2);
            }
        }
        while (gotItem);
    }
}

不知道这是否正是您要寻找的东西,但希望能有所帮助.

标签:time-series,linq-to-objects,linq,c
来源: https://codeday.me/bug/20191210/2104028.html