根據指定的索引鍵選取器函式,將可觀察序列的專案分組,並使用指定的函式來選取產生的元素。
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
類型持續時間。
參數
- source
類型:System.IObservable< TSource>
可觀察的序列,其專案要分組。
- keySelector
類型:System.Func< TSource、TKey>
用來擷取各項目之索引鍵的函式。
- elementSelector
類型:System.Func< TSource、TElement>
函式,將每個來源專案對應至可觀察群組中的專案。
- durationSelector
類型:System.Func<IGroupedObservable< TKey、TElement > 、IObservable< TDuration>>
表示群組到期的函式。
傳回值
類型: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