में एक स्लाइडिंग विंडो को कार्यान्वित करने में समस्या मैंने प्रतिक्रियाशील एक्सटेंशन के लिए एक स्लाइडिंगविंडो() ऑपरेटर बनाया क्योंकि मैं आसानी से रोलिंग औसत जैसी चीज़ों की निगरानी करना चाहता हूं। एक साधारण उदाहरण के रूप में, मैं माउस ईवेंट सुनने के लिए सदस्यता लेना चाहता हूं, लेकिन हर बार एक ऐसा कार्यक्रम है जिसे मैं अंतिम तीन प्राप्त करना चाहता हूं (पिछले तीन प्राप्त करने के लिए हर तीसरे कार्यक्रम की प्रतीक्षा करने के बजाय)। यही कारण है कि मुझे मिली विंडो ओवरलोड मुझे ऐसा नहीं लगता है कि मुझे बॉक्स से बाहर क्या चाहिए।आरएक्स
यही वह है जो मैं आया था। मुझे डर है कि यह सबसे शक्तिशाली समाधान नहीं हो सकता है इसकी लगातार सूची संचालन दिया:
public static IObservable<List<T>> SlidingWindow<T>(this IObservable<T> seq, int length)
{
var seed = new List<T>();
Func<List<T>, T, List<T>> accumulator = (list, arg2) =>
{
list.Add(arg2);
if (list.Count > length)
list.RemoveRange(0, (list.Count - length));
return list;
};
return seq.Scan(seed, accumulator)
.Where(list => list.Count == length);
}
यह इस तरह से कहा जाता जा सकता है:
var rollingSequence = Observable.Range(1, 5).SlidingWindow().ToEnumerable();
लेकिन, मेरा महान आश्चर्य करने के लिए, बजाय प्राप्त करने के अपेक्षित परिणाम
1,2,3
2,3,4
3,4,5
मैं परिणाम प्राप्त
2,3,4
3,4,5
3,4,5
किसी भी अंतर्दृष्टि की सराहना की जाएगी!
@blaster कोई समस्या नहीं - असल में, मुझे "बनाने" के लिए धन्यवाद, इसे लिखने के लिए धन्यवाद, क्योंकि मैंने इसे जवाब देने के बाद इसे दो बार इस्तेमाल किया है। ;) – JerKimball
मुझे नहीं लगता कि यह अच्छा है। Publish(), .Range (0, x) और .Skip() - जब ये संयुक्त होते हैं तो यह खराब प्रदर्शन की तरह दिखता है, विशेष रूप से ओ n^2, क्योंकि Skip पूरे स्ट्रीम को फिर से चालू करने जा रहा है।उदाहरण के लिए, आपको (10000, 10001, 10002) प्राप्त करने के लिए 30,000 पूर्णांक फिर से शुरू करने की आवश्यकता होगी। तो आप वास्तव में स्मृति में स्रोत स्ट्रीम का एक स्लाइडिंग बफर नहीं रखते हैं, आपको स्मृति में संपूर्ण स्रोत स्ट्रीम (समय की शुरुआत के बाद से) रखना होगा, जो मैंने सोचा था कि हम से परहेज कर रहे थे। – yzorg
@yzorg संपादित करें – JerKimball