共用方式為


Observable.GroupByUntil < TSource, TKey, TElement, TDuration > 方法 (IObservable < TSource > , Func TSource, TKey, Func < TSource, TElement, Func << IGroupedObservable < TKey > , TElement >> , IObservable < TDuration >>)

根據指定的索引鍵選取器函式,將可觀察序列的專案分組,並使用指定的函式來選取產生的元素。

Namespace:System.Reactive.Linq
裝配: System.Reactive.dll) 中的 System.Reactive (

Syntax

'Declaration
<ExtensionAttribute> _
Public Shared Function GroupByUntil(Of TSource, TKey, TElement, TDuration) ( _
    source As IObservable(Of TSource), _
    keySelector As Func(Of TSource, TKey), _
    elementSelector As Func(Of TSource, TElement), _
    durationSelector As Func(Of IGroupedObservable(Of TKey, TElement), IObservable(Of TDuration)) _
) As IObservable(Of IGroupedObservable(Of TKey, TElement))
'Usage
Dim source As IObservable(Of TSource)
Dim keySelector As Func(Of TSource, TKey)
Dim elementSelector As Func(Of TSource, TElement)
Dim durationSelector As Func(Of IGroupedObservable(Of TKey, TElement), IObservable(Of TDuration))
Dim returnValue As IObservable(Of IGroupedObservable(Of TKey, TElement))

returnValue = source.GroupByUntil(keySelector, _
    elementSelector, durationSelector)
public static IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(
    this IObservable<TSource> source,
    Func<TSource, TKey> keySelector,
    Func<TSource, TElement> elementSelector,
    Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector
)
[ExtensionAttribute]
public:
generic<typename TSource, typename TKey, typename TElement, typename TDuration>
static IObservable<IGroupedObservable<TKey, TElement>^>^ GroupByUntil(
    IObservable<TSource>^ source, 
    Func<TSource, TKey>^ keySelector, 
    Func<TSource, TElement>^ elementSelector, 
    Func<IGroupedObservable<TKey, TElement>^, IObservable<TDuration>^>^ durationSelector
)
static member GroupByUntil : 
        source:IObservable<'TSource> * 
        keySelector:Func<'TSource, 'TKey> * 
        elementSelector:Func<'TSource, 'TElement> * 
        durationSelector:Func<IGroupedObservable<'TKey, 'TElement>, IObservable<'TDuration>> -> IObservable<IGroupedObservable<'TKey, 'TElement>> 
JScript does not support generic types and methods.

類型參數

  • TSource
    類型來源。
  • TKey
    類型索引鍵。
  • TElement
    類型專案。
  • TDuration
    類型持續時間。

參數

  • keySelector
    類型:System.Func< TSource、TKey>
    用來擷取各項目之索引鍵的函式。
  • elementSelector
    類型:System.Func< TSource、TElement>
    函式,將每個來源專案對應至可觀察群組中的專案。

傳回值

類型:System.IObservable<IGroupedObservable< TKey、TElement>>
可觀察的群組序列,每個群組都對應至唯一索引鍵值,其中包含共用相同索引鍵值的所有元素。

使用注意事項

在 Visual Basic 和 C# 中,您可以在IObservable< TSource > 類型的任何物件上呼叫此方法作為實例方法。 使用執行個體方法語法呼叫這個方法時,請省略第一個參數。 如需詳細資訊,請參閱

備註

GroupByUntil 運算子會將可觀察的序列分成可觀察的群組序列,此序列具有 durationSelector 函式所設定的到期時間範圍。

範例

這個簡單範例示範如何使用 GroupByUntil 運算子,將隨機整數連續序列分組成在十秒後到期的群組。 按 ENTER 將會結束範例程式碼。

using System;
using System.Reactive.Linq;
using System.Reactive.Concurrency;

namespace Example
{
  class Program
  {
    static void Main()
    {
      //*****************************************************************************************//
      //*** Generate a sequence of random integers less than 100 every seconds continuously.  ***//
      //*****************************************************************************************//

      Random rand = new Random();

      var obs = Observable.Generate(rand.Next(100),                      // Initial value
                                    x => true,                           // The termination condition. Never terminate.
                                    x => rand.Next(100),                 // Iteration step function 
                                    x => x,                              // Selector function 
                                    x => TimeSpan.FromMilliseconds(500), // timeSelector Delay function
                                    Scheduler.ThreadPool);               // Schedule on a .NET threadpool thread 


      //*************************************************************************************//
      //*** Generate a groups of the random integers in the sequence that are in the 80s. ***//
      //*** Each grouping has an expiration set to expire in 10 seconds. This is set by   ***//
      //*** the durationSelector function which returns an observable sequence of time    ***//
      //*** spans set to 10 seconds.                                                      ***//
      //*************************************************************************************//

      int groupExpirationSec = 10;
      var obsEighties = obs.GroupByUntil(x => (x > 79) && (x < 90),
                                         x => x,
                                         x => Observable.Timer(TimeSpan.FromSeconds(groupExpirationSec)));


      //*************************************************************************************//
      //*** Subscribe to the grouped sequences. Each grouped sequence will expire after   ***//
      //*** 10 seconds by completing the sequence. Display timings with the sequence so   ***//
      //*** this is evident.                                                              ***//
      //*************************************************************************************//

      obsEighties.Subscribe(groupedObs => 
      {

        if (groupedObs.Key == true) // True for eighties group
        {
          Console.WriteLine("\nNew eighties group\nThis group should expire at {0}\n",
                            (DateTime.Now + TimeSpan.FromSeconds(groupExpirationSec)).ToLongTimeString());

          groupedObs.Subscribe(x => Console.WriteLine(x),
                               () => Console.WriteLine("\nGrouped sequence completed or expired. {0}\n",
                                                       DateTime.Now.ToLongTimeString()));
        }
      });

      Console.ReadLine();
    }
  }
}

下列輸出是使用範例程式碼所產生。

New eighties group
This group should expire at 5:10:22 PM

86
88
81
81
89

Grouped sequence completed or expired. 5:10:22 PM


New eighties group
This group should expire at 5:10:33 PM

80
88
80
88

Grouped sequence completed or expired. 5:10:33 PM


New eighties group
This group should expire at 5:10:50 PM

81
83
83
82
81

Grouped sequence completed or expired. 5:10:50 PM


New eighties group
This group should expire at 5:11:01 PM

85
86
88

Grouped sequence completed or expired. 5:11:01 PM

另請參閱

參考

Observable 類別

GroupByUntil 多載

System.Reactive.Linq 命名空間