Observable.GroupByUntil<TSource, TKey, TElement, TDuration> Method (IObservable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>>)
Группирует элементы наблюдаемой последовательности в соответствии с указанной функцией селектора ключей и выбирает результирующие элементы с помощью указанной функции.
Пространство имен:System.Reactive.Linq
Сборки: System.Reactive (в System.Reactive.dll)
Синтаксис
'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
Элемент type.
- 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 для группировки непрерывной последовательности случайных целых чисел в группы, срок действия которой истекает через десять секунд. Нажатие клавиши ВВОД приведет к выходу из примера кода.
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