관찰 가능한 시퀀스의 요소를 그룹화하고 지정된 함수를 사용하여 결과 요소를 선택합니다.
네임스페이스:System.Reactive.Linq
어셈블리: System.Reactive(System.Reactive.dll)
Syntax
'Declaration
<ExtensionAttribute> _
Public Shared Function GroupBy(Of TSource, TKey, TElement) ( _
source As IObservable(Of TSource), _
keySelector As Func(Of TSource, TKey), _
elementSelector As Func(Of TSource, TElement) _
) 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 returnValue As IObservable(Of IGroupedObservable(Of TKey, TElement))
returnValue = source.GroupBy(keySelector, _
elementSelector)
public static IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(
this IObservable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TSource, TElement> elementSelector
)
[ExtensionAttribute]
public:
generic<typename TSource, typename TKey, typename TElement>
static IObservable<IGroupedObservable<TKey, TElement>^>^ GroupBy(
IObservable<TSource>^ source,
Func<TSource, TKey>^ keySelector,
Func<TSource, TElement>^ elementSelector
)
static member GroupBy :
source:IObservable<'TSource> *
keySelector:Func<'TSource, 'TKey> *
elementSelector:Func<'TSource, 'TElement> -> IObservable<IGroupedObservable<'TKey, 'TElement>>
JScript does not support generic types and methods.
형식 매개 변수
- TSource
형식 원본입니다.
- TKey
형식 키입니다.
- TElement
type 요소입니다.
매개 변수
- source
형식: System.IObservable<TSource>
요소를 그룹화할 관찰 가능한 시퀀스입니다.
- keySelector
형식: System.Func<TSource, TKey>
각 요소에 대해 키를 추출하는 함수입니다.
- elementSelector
형식: System.Func<TSource, TElement>
각 원본 요소를 관찰 가능한 그룹의 요소에 매핑하는 함수입니다.
반환 값
형식: System.IObservable<IGroupedObservable<TKey, TElement>>
동일한 키 값을 공유하는 모든 요소를 포함하는 고유한 키 값에 해당하는 관찰 가능한 그룹의 시퀀스입니다.
사용 정보
Visual Basic 및 C#에서는 IObservable TSource> 형식의 모든 개체에서 이 메서드를 instance 메서드로 호출할 수 있습니다<. 인스턴스 메서드 구문을 사용하여 이 메서드를 호출할 경우에는 첫 번째 매개 변수를 생략합니다. 자세한 내용은 또는 를 참조하세요.
설명
GroupBy 연산자는 키 값에 따라 항목의 원본 시퀀스를 그룹으로 그룹화하는 데 사용됩니다. 각 키 값은 keySelector 함수의 결과이며 소스 시퀀스의 각 항목에서 파생될 수 있습니다. GroupBy 연산자의 결과는 IGroupedObservable<TKey, TElement> 시퀀스로 표시되는 그룹화된 항목의 시퀀스입니다. IGroupedObservable은 그룹화된 시퀀스를 식별하는 키 속성을 노출합니다. 결과 그룹화된 시퀀스의 실제 항목은 각 원본 항목에 적용된 elementSelector 함수의 결과에 의해 제어됩니다.
예제
이 예제 코드는 지난 6시간 이내에 발생한 이벤트 로그 레코드의 시퀀스를 생성합니다. 그런 다음 GroupBy 연산자를 LINQ 문과 함께 사용하여 "Error" 또는 "Critical"로 평가되는 LevelDisplayName 속성을 기반으로 오류인 이벤트 레코드를 그룹화합니다. true이면 키 선택기 함수의 결과가 true이면 이벤트 레코드가 오류 그룹에 그룹화됩니다. GroupBy 연산자의 결과는 IGroupedObservable<Boolean, EventRecord>입니다. 이 IGroupedObservable 시퀀스는 그룹화된 오류 이벤트 로그 항목에 액세스하기 위해 구독됩니다. 이 코드는 그룹 시퀀스를 검사하여 키 값이 true인 그룹을 찾습니다. true의 키 값은 오류 그룹을 식별합니다. 그러면 해당 오류 그룹이 구독되고 오류 이벤트 로그 항목이 콘솔 창에 기록됩니다.
using System;
using System.Reactive.Linq;
using System.Reactive.Concurrency;
using System.Diagnostics.Eventing.Reader;
using System.IO;
namespace Example
{
class Program
{
static void Main()
{
//************************************************************************************************//
//*** Generate a sequence of event log entries that have been written to the system event log ***//
//*** within the last 6 hours. ***//
//************************************************************************************************//
const int eventLogTimeSpan = 6;
EventLogReader sysEventLog = new EventLogReader("System");
//****************************************************************************************************//
//*** Start with the last entry in the event log. ***//
//*** Stop on an event generated at a time more than the EventLogTimeSpan (6 hrs in this example). ***//
//*** Each iteration function will step back one entry. ***//
//*** The resultSelector function will just select each entry for inclusion in the sequence. ***//
//*** The ThreadPool schedule schedules the processing of the event log on a thread pool thread ***//
//****************************************************************************************************//
sysEventLog.Seek(SeekOrigin.End,0);
EventRecord lastEntry = sysEventLog.ReadEvent();
var eventLogEntrySeq = Observable.Generate(lastEntry,
x => (DateTime.Now - x.TimeCreated) < TimeSpan.FromHours(eventLogTimeSpan),
x => {sysEventLog.Seek(x.Bookmark,-1); return sysEventLog.ReadEvent();},
x => x,
Scheduler.ThreadPool);
//************************************************************************************************************//
//*** Use the GroupBy operator with LINQ to group the sequence into entries that are errors (key=true) and ***//
//*** those that are not errors (key=false). ***//
//************************************************************************************************************//
var eventLogGroupedSeq =
from entry in eventLogEntrySeq
group entry by (entry.LevelDisplayName == "Error") || (entry.LevelDisplayName == "Critical") into groupedEntries
select groupedEntries;
//***************************************************************************************//
//*** eventLogGroupedSeq is a IGroupedObservable<Boolean, EventRecord>. Subscribing ***//
//*** will return a sequence of the groups. For this example, we only want the group ***//
//*** where the key is true indicating the Error entries group. So we then subscribe ***//
//*** to that grouped sequence to write the error entries that occurred within the ***//
//*** last 6 hours. ***//
//***************************************************************************************//
eventLogGroupedSeq.Subscribe(groupedSeq =>
{
if (groupedSeq.Key == true)
{
groupedSeq.Subscribe(evtEntry => Console.WriteLine("ID : {0}\n" +
"Type : {1}\n" +
"Source: {2}\n" +
"Time Generated: {3}\n" +
"Message: {4}\n",
evtEntry.Id,
evtEntry.LevelDisplayName,
evtEntry.ProviderName,
evtEntry.TimeCreated.ToString(),
evtEntry.FormatDescription()));
}
});
Console.WriteLine("\nDisplaying error entries from the system event log\n" +
"that occurred within the last {0} hours...\n\n" +
"Press ENTER to exit...\n",eventLogTimeSpan);
Console.ReadLine();
}
}
}
다음 출력은 예제 코드를 사용하여 생성되었습니다.
Displaying error entries from the system event log
that occurred within the last 6 hours...
Press ENTER to exit...
ID : 34001
Type : Error
Source: Microsoft-Windows-SharedAccess_NAT
Time Generated: 5/31/2011 4:39:18 AM
Message: The ICS_IPV6 failed to configure IPv6 stack.
ID : 34001
Type : Error
Source: Microsoft-Windows-SharedAccess_NAT
Time Generated: 5/31/2011 4:01:36 AM
Message: The ICS_IPV6 failed to configure IPv6 stack.
ID : 34001
Type : Error
Source: Microsoft-Windows-SharedAccess_NAT
Time Generated: 5/31/2011 3:49:29 AM
Message: The ICS_IPV6 failed to configure IPv6 stack.
ID : 34001
Type : Error
Source: Microsoft-Windows-SharedAccess_NAT
Time Generated: 5/31/2011 3:11:47 AM
Message: The ICS_IPV6 failed to configure IPv6 stack.
ID : 34001
Type : Error
Source: Microsoft-Windows-SharedAccess_NAT
Time Generated: 5/31/2011 2:59:40 AM
Message: The ICS_IPV6 failed to configure IPv6 stack.