Freigeben über


Observable.GroupBy<TSource, TKey, TElement-Methode> (IObservable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>)

Gruppiert die Elemente einer beobachtbaren Sequenz und wählt die resultierenden Elemente mithilfe einer angegebenen Funktion aus.

Namespace:System.Reactive.Linq
Versammlung: System.Reaktiv (in 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.

Typparameter

  • TSource
    Die Typenquelle.
  • TKey
    Der Typschlüssel.
  • Telement
    Das type-Element.

Parameter

  • source
    Typ: System.IObservable<TSource>
    Eine beobachtbare Sequenz, deren Elemente gruppiert werden sollen.
  • keySelector dargestellt wird
    Typ: System.Func<TSource, TKey>
    Eine Funktion zum Extrahieren des Schlüssels für jedes Element.
  • Elementselector
    Typ: System.Func<TSource, TElement>
    Eine Funktion, um jedes Quellelement einem Element in einer beobachtbaren Gruppe zuzuordnen.

Rückgabewert

Typ: System.IObservable<IGroupedObservable<TKey, TElement>>
Eine Sequenz beobachtbarer Gruppen, die jeweils einem eindeutigen Schlüsselwert entsprechen, der alle Elemente enthält, die denselben Schlüsselwert gemeinsam haben.

Hinweis zur Verwendung

In Visual Basic und C# können Sie diese Methode als instance-Methode für jedes Objekt vom Typ IObservable<TSource> aufrufen. Bei Verwendung der Syntax für Instanzenmethoden lassen Sie den ersten Parameter aus. Weitere Informationen finden Sie unter oder .

Bemerkungen

Der GroupBy-Operator wird verwendet, um eine Quellsequenz von Elementen basierend auf einem Schlüsselwert in Gruppen zu gruppieren. Jeder Schlüsselwert ist das Ergebnis der keySelector-Funktion und kann von jedem Element in der Quellsequenz abgeleitet werden. Das Ergebnis des GroupBy-Operators ist eine Sequenz gruppierter Elemente, die durch eine Sequenz von IGroupedObservable<TKey, TElement>, dargestellt werden. IGroupedObservable macht eine Schlüsseleigenschaft verfügbar, die die gruppierte Sequenz identifiziert. Die tatsächlichen Elemente in den resultierenden gruppierten Sequenzen werden durch das Ergebnis der elementSelector-Funktion gesteuert, die auf jedes Quellelement angewendet wird.

Beispiele

Dieser Beispielcode generiert die Sequenz von Ereignisprotokolldatensätzen, die innerhalb der letzten sechs Stunden aufgetreten sind. Der GroupBy-Operator wird dann mit einer LINQ-Anweisung verwendet, um Ereignisdatensätze zu gruppieren, bei denen es sich um Fehler handelt, die auf der LevelDisplayName-Eigenschaft basieren, die zu "Error" oder "Critical" ausgewertet wird. Wenn dies true ist, ist das Ergebnis der Schlüsselauswahlfunktion true, was dazu führt, dass der Ereignisdatensatz in der Fehlergruppe gruppiert wird. Das Ergebnis des GroupBy-Operators ist ein IGroupedObservable<Boolean, EventRecord>. Diese Sequenz von IGroupedObservable wird für den Zugriff auf die gruppierten Fehlerereignisprotokolleinträge abonniert. Der Code untersucht die Reihenfolge der Gruppen, um die Gruppe zu finden, in der der Schlüsselwert true ist. Der Schlüsselwert true identifiziert die Fehlergruppe. Diese Fehlergruppe wird dann abonniert, und die Fehlerereignisprotokolleinträge werden in das Konsolenfenster geschrieben.

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();
    }
  }
}

Die folgende Ausgabe wurde mit dem Beispielcode generiert.

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.

Weitere Informationen

Verweis

Beobachtbare Klasse

GroupBy-Überladung

System.Reactive.Linq-Namespace