Partager via


Observable.GroupBy<TSource, TKey, TElement> , méthode (IObservable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>)

Regroupe les éléments d’une séquence observable et sélectionne les éléments résultants à l’aide d’une fonction spécifiée.

Espace de noms :System.Reactive.Linq
Assemblée: System.Reactive (en System.Reactive.dll)

Syntaxe

'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.

Paramètres de type

  • TSource
    Source de type.
  • TKey
    Clé de type.
  • TElement
    Élément type.

Paramètres

  • source
    Type : System.IObservable<TSource>
    Séquence observable dont les éléments à regrouper.
  • keySelector
    Type : System.Func<TSource, TKey>
    Fonction permettant d'extraire la clé de chaque élément.
  • elementSelector
    Type : System.Func<TSource, TElement>
    Fonction permettant de mapper chaque élément source à un élément dans un groupe observable.

Valeur de retour

Type : System.IObservable<IGroupedObservable<TKey, TElement>>
Séquence de groupes observables, chacun correspondant à une valeur de clé unique, contenant tous les éléments qui partagent cette même valeur de clé.

Remarque sur l'utilisation

En Visual Basic et C#, vous pouvez appeler cette méthode en tant que méthode instance sur n’importe quel objet de type IObservable<TSource>. Lorsque vous utilisez la syntaxe des méthodes d'instance pour appeler cette méthode, omettez le premier paramètre. Pour plus d'informations, consultez ou .

Notes

L’opérateur GroupBy est utilisé pour regrouper une séquence source d’éléments en groupes en fonction d’une valeur de clé. Chaque valeur de clé est le résultat de la fonction keySelector et peut être dérivée de chaque élément de la séquence source. Le résultat de l’opérateur GroupBy est une séquence d’éléments groupés représentés par une séquence de TKey IGroupedObservable<, TElement>. IGroupedObservable expose une propriété de clé qui identifie la séquence groupée. Les éléments réels dans les séquences groupées résultantes sont contrôlés par le résultat de la fonction elementSelector appliquée à chaque élément source.

Exemples

Cet exemple de code génère la séquence d’enregistrements du journal des événements qui se sont produits au cours des six dernières heures. L’opérateur GroupBy est ensuite utilisé avec une instruction LINQ pour regrouper les enregistrements d’événements qui sont des erreurs basées sur la propriété LevelDisplayName qui est évalué à « Error » ou « Critical ». Si cette valeur est true, le résultat de la fonction de sélecteur de clé est true, ce qui entraîne le regroupement de l’enregistrement d’événements dans le groupe d’erreurs. Le résultat de l’opérateur GroupBy est un objet booléen IGroupedObservable<, EventRecord>. Cette séquence d’IGroupedObservable est abonnée pour accéder aux entrées du journal des événements des erreurs groupées. Le code examine la séquence de groupes pour rechercher le groupe où la valeur de clé est true. La valeur de clé true identifie le groupe d’erreurs. Ce groupe d’erreurs est ensuite abonné et les entrées du journal des événements des erreurs sont écrites dans la fenêtre de console.

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

La sortie suivante a été générée avec l’exemple de code.

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.

Voir aussi

Référence

Classe Observable

GroupBy Overload

Espace de noms System.Reactive.Linq