3

時系列データを処理するための単純な内部フレームワークを設計しています。LINQ が私の現在のおもちゃのハンマーであることを考えると、LINQ ですべてを叩きたいです。

クラス TimeSeries (Select()、Where() など) にメソッドを実装して、LINQ 構文を使用して時系列データを処理できるようにしたい

たとえば (A の x から x+10 を選択)、新しい時系列が得られます。

2 つ以上の時系列を組み合わせるのに最適な構文設計は何ですか? (from a in A from b in B select a+b) はネストされたループを表現するため、あまり良くありません。たぶんいくつか参加しますか?これは、暗黙の時間変数の結合に対応する必要があります。(私が念頭に置いているのは、lisp 'zip'関数に対応しています)


編集: いくつかの明確化が必要です。

時系列は、株価などの時間に依存する一種の機能です。時系列の組み合わせは、時間の関数としての 2 つの株価の差である可能性があります。

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

可能ですが、これを LINQ 構文を使用してきちんと表現できますか? 私はclass MyTimeSeries自分でLINQメソッドを実装することを期待しています。

4

4 に答える 4

1

Bjarke、NEsperを見てください。これは、SQLのような時系列クエリを実行するオープンソースの複合イベント処理アプリです。あなたは彼らがそれをどのように行ったかを学ぶことができます、あるいはおそらくあなたの目標を達成するために彼らのコードを活用することさえできます。ここにリンクhttp://esper.codehaus.org/about/nesper/nesper.html

于 2008-10-27T22:31:29.393 に答える
1

Union正しい方法のように聞こえます-クエリ式のサポートはありませんが、あなたの言いたいことを表現していると思います.

場合によっては適切に使用できるMiscUtilの Range ベースのクラスに興味があるかもしれません。少しの拡張メソッドの楽しみと組み合わせると、次のことができます。

foreach (DateTime day in 19.June(1976).To(DateTime.Today).Step(1.Day()))
{
    Console.WriteLine("I'm alive!");
}

これがあなたがしていることすべてに取って代わるべきだと言っているわけではありません。気軽に貢献してください:)

于 2008-10-27T21:38:20.533 に答える
1

私のNExtensionプロジェクトから:

public static IEnumerable<TResult> Zip<T1, T2, TResult>(
    this IEnumerable<T1> source1, 
    IEnumerable<T2> source2, 
    Func<T1, T2, TResult> combine)
{
    if (source1 == null)
        throw new ArgumentNullException("source1");
    if (source2 == null)
        throw new ArgumentNullException("source2");
    if (combine == null)
        throw new ArgumentNullException("combine");

    IEnumerator<T1> data1 = source1.GetEnumerator();
    IEnumerator<T2> data2 = source2.GetEnumerator();
    while (data1.MoveNext() && data2.MoveNext())
    {
        yield return combine(data1.Current, data2.Current);
    }
}

構文は次のとおりです。

Stock1.Zip(Stock2, (a,b)=>a-b)
于 2008-10-27T22:27:35.893 に答える
0

質問を正しく理解している場合、シーケンス内の位置に基づいて複数のシーケンスに参加しますか?

とメソッドの両方が結合キーに基づいているため、System.Linq.Enumerableクラスにはこれを行うものはありません。ただし、偶然にも、この目的のためのメソッドを数日前に作成し、例のように使用しました。JoinGroupJoinPositionalJoin

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);
    }
}

これがまさにあなたが探しているものかどうかはわかりませんが、うまくいけば助けになります。

于 2008-10-27T22:15:09.367 に答える