سؤال

أنا تصميم بسيط الداخلية في إطار التعامل مع بيانات السلاسل الزمنية.بالنظر إلى أن ينق هو بلدي الحالي لعبة المطرقة ، أريد أن ضرب أي شيء.

أريد لتنفيذ طرق في الصف TimeSeries (حدد () ، حيث() وهلم جرا) حتى يمكنني استخدام LINQ جملة للتعامل مع بيانات السلاسل الزمنية

بعض الأشياء هي على التوالي إلى الأمام, على سبيل المثال(من x في تحديد x+10) ، مع إعطاء وقت جديد من السلسلة.

ما هي أفضل جملة تصميم الجمع بين اثنين أو أكثر من وقت المسلسل ؟ (من في من ب في ب select a+b) ليست كبيرة ، لأنه يعبر عن حلقة متداخلة.ربما بعض الانضمام ؟ هذا يجب أن تتوافق مع الانضمام على ضمنيا الوقت متغير.(ما يجب في العقل يتوافق مع اللثغة 'الرمز' وظيفة)


تحرير: بعض التوضيح ضروري.

سلسلة زمنية هو نوع من وظيفة اعتمادا على الوقت ، على سبيل المثالأسعار الأسهم.مجموعة من السلاسل الزمنية يمكن أن يكون الفرق بين اثنين من أسعار الأسهم ، بوصفها وظيفة من الزمن.

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

هو ممكن ، ولكن يمكن أن يكون هذا التعبير عنها بدقة باستخدام بعض LINQ syntax ؟ أنا أتوقع لتنفيذ LINQ الطرق في class MyTimeSeries نفسي.

هل كانت مفيدة؟

المحلول

إن كنت فهمت السؤال بشكل صحيح ، كنت ترغب في الانضمام إلى العديد من متواليات على أساس وضعهم ضمن التسلسل ؟

ليس هناك أي شيء في 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);
    }
}

لست متأكدا إذا كان هذا هو بالضبط ما تبحث عنه, ولكن نأمل من بعض المساعدة.

نصائح أخرى

Union يبدو الطريق الصحيح للذهاب - لا تعبير استعلام الدعم ، ولكن أعتقد أنه يعبر عن ما تعنيه.

كنت قد تكون مهتمة في النظر في مجموعة القائم على دروس في MiscUtil والتي يمكن أن يكون لطيف تستخدم مرات.جنبا إلى جنب مع قليلا من طريقة التمديد متعة يمكنك القيام به:

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

أنا لا أقترح هذا يجب استبدال كل ما تفعله فقط أن كنت قد تكون قادرة على اتخاذ بعض الأفكار لجعل حتى أكثر إتقانا.لا تتردد في المساهمة أيضا :)

من 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)

Bjarke ، نلقي نظرة على NEsper انه مفتوح المصدر مجمع معالجة الحدث التطبيق التي من بين أمور أخرى لا مثل SQL الوقت سلسلة من الاستفسارات.يمكنك إما تعلم كيف فعلوا ذلك ، أو ربما حتى الرافعة المالية التعليمات البرمجية الخاصة بهم لتحقيق الهدف الخاص بك.الرابط هنا http://esper.codehaus.org/about/nesper/nesper.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top