Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Beispiel wird gezeigt, wie Aggregate die Methode verwendet wird, um eine benutzerdefinierte Aggregationsfunktion auf eine Quellsequenz anzuwenden.
Warnung
Dieses Beispiel soll die Verwendung veranschaulichen und kann nicht schneller als die entsprechende sequenzielle LINQ to Objects-Abfrage ausgeführt werden. Weitere Informationen zum Thema Beschleunigung finden Sie unter Verstehen von Beschleunigung in PLINQ.
Beispiel
Im folgenden Beispiel wird die Standardabweichung einer Folge ganzzahliger Zahlen berechnet.
namespace PLINQAggregation
{
using System;
using System.Linq;
class aggregation
{
static void Main(string[] args)
{
// Create a data source for demonstration purposes.
int[] source = new int[100000];
Random rand = new Random();
for (int x = 0; x < source.Length; x++)
{
// Should result in a mean of approximately 15.0.
source[x] = rand.Next(10, 20);
}
// Standard deviation calculation requires that we first
// calculate the mean average. Average is a predefined
// aggregation operator, along with Max, Min and Count.
double mean = source.AsParallel().Average();
// We use the overload that is unique to ParallelEnumerable. The
// third Func parameter combines the results from each thread.
double standardDev = source.AsParallel().Aggregate(
// initialize subtotal. Use decimal point to tell
// the compiler this is a type double. Can also use: 0d.
0.0,
// do this on each thread
(subtotal, item) => subtotal + Math.Pow((item - mean), 2),
// aggregate results after all threads are done.
(total, thisThread) => total + thisThread,
// perform standard deviation calc on the aggregated result.
(finalSum) => Math.Sqrt((finalSum / (source.Length - 1)))
);
Console.WriteLine($"Mean value is = {mean}");
Console.WriteLine($"Standard deviation is {standardDev}");
Console.ReadLine();
}
}
}
Class aggregation
Private Shared Sub Main(ByVal args As String())
' Create a data source for demonstration purposes.
Dim source As Integer() = New Integer(99999) {}
Dim rand As New Random()
For x As Integer = 0 To source.Length - 1
' Should result in a mean of approximately 15.0.
source(x) = rand.[Next](10, 20)
Next
' Standard deviation calculation requires that we first
' calculate the mean average. Average is a predefined
' aggregation operator, along with Max, Min and Count.
Dim mean As Double = source.AsParallel().Average()
' We use the overload that is unique to ParallelEnumerable. The
' third Func parameter combines the results from each thread.
' initialize subtotal. Use decimal point to tell
' the compiler this is a type double. Can also use: 0d.
' do this on each thread
' aggregate results after all threads are done.
' perform standard deviation calc on the aggregated result.
Dim standardDev As Double = source.AsParallel().Aggregate(0.0R, Function(subtotal, item) subtotal + Math.Pow((item - mean), 2), Function(total, thisThread) total + thisThread, Function(finalSum) Math.Sqrt((finalSum / (source.Length - 1))))
Console.WriteLine("Mean value is = {0}", mean)
Console.WriteLine("Standard deviation is {0}", standardDev)
Console.ReadLine()
End Sub
End Class
In diesem Beispiel wird eine Überladung des Standardabfrageoperators für Aggregationen verwendet, die für PLINQ einzigartig ist. Diese Überladung erfordert System.Func<T1,T2,TResult> als dritten Eingabeparameter. Dieser Delegat kombiniert die Ergebnisse aller Threads, bevor die endgültige Berechnung für die aggregierten Ergebnisse ausgeführt wird. In diesem Beispiel fügen wir die Summen aus allen Threads zusammen.
Beachten Sie, dass, wenn ein Lambda-Ausdruckskörper aus einem einzigen Ausdruck besteht, der Rückgabewert des System.Func<T,TResult>-Delegaten der Wert des Ausdrucks ist.