문제

나는 디자인에는 간단한 내부 프레임워크에 대한 처리 시간을 데이터 시리즈.된 LINQ 는 현재는 장난감,망치고 싶은 모든 것을 공격합니다.

을 구현하려는 방법에스 TimeSeries(Select()에())에서 사용할 수 있는 LINQ 구문을 처리하시리즈 데이터

어떤 것은 바로 앞으로,예를 들어,(x 에서 선택 x+10),을 주는 새로운 시리즈입니다.

는 무엇이 최선 구문 디자인 결합하기 위한 두 개 이상의 시계열?(터에서 b B select a+b)지 않기 때문에 그것을 표현한 중첩된다.어쩌면 일부는 가입?이것에 대응해야 참여에 암시간 변수입니다.(나는 무엇을 해야에서 마음에 해당하는 lisp'zip'능)


편집: 일부를 설명이 필요하다.

시계열의 종류는 기능이 시간에 따라,예를 들어,stock quotes.조 시간의 시리즈 될 수 있는 사이의 차이는 두 가지 주식 가격,시간의 함수로.

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

은 가능하지만,이 될 수 있습니다 깔끔하게 표현을 사용하여 어떤 LINQ 구?내가 기대하고 구현하 LINQ 방법 class MyTimeSeries 자신입니다.

도움이 되었습니까?

해결책

이해하고 있다면 질문을 제대로,당신이 가입하려는 여러 시퀀스에 따라 자신의 위치에서 순?

거기에 아무것도 아니에 System.Linq.Enumerable 클래스를 이렇게 모두로 JoinGroupJoin 방법은 기반에 참여 키를 사용합니다.그러나 우연의 일치에 의해 썼 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);
    }
}

가 확실하지 않으면 이것은 정확하게 당신이 찾고있는 무엇,그러나 희망의 일부는 도움이됩니다.

다른 팁

Union 소리처럼 올바른 방법으로-아 쿼리를 표현이 지원하지만,제가 생각을 표현이 무엇을 의미합니다.

에 관심이 있을 수도 있습니다 찾는 범위에서 기반의 클래스 MiscUtil 할 수 있는 멋지게 사용을 위한 시간.과 함께 약간의 방법 확장 재미있는,당신이 할 수 있는 일:

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

나는 이 대체해야 합 어떤 일을 하는지,그냥 당신할 수 있습니다 몇 가지 아이디어도 깔끔.자유롭게 기여 다시,too:)

에서 나 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)

명을 살펴 NEsper,그것은 오픈 소스 복잡한 이벤트를 처리하는 다른 것들 사이에는 SQL 시간이 시리즈는 쿼리를 처리합니다.할 수 있는 방법을 배우들이 그것을 했고,또는 아마도 활용하여 그들의 코드를 달성하는 목표입니다.여기 링크 http://esper.codehaus.org/about/nesper/nesper.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top