İngilizce dilinde oku

Aracılığıyla paylaş


Nasıl yapılır: PLINQ Sorgusunda Sıralamayı Denetleme

Bu örnekler, AsOrdered uzantısı yöntemini kullanarak PLINQ sorgusunda sıralamanın nasıl denetleneceğini gösterir.

Uyarı

Bu örnekler öncelikli olarak kullanımı göstermek için tasarlanmıştır ve eşdeğer sıralı LINQ to Objects sorgularından daha hızlı çalışabilir veya çalışmayabilir.

Örnek 1

Aşağıdaki örnek, kaynak dizisinin sıralamasını korur. Bu bazen gereklidir; Örneğin, bazı sorgu işleçleri doğru sonuçları elde etmek için sıralı bir kaynak dizisi gerektirir.

var source = Enumerable.Range(9, 10000);

// Source is ordered; let's preserve it.
var parallelQuery =
    from num in source.AsParallel().AsOrdered()
    where num % 3 == 0
    select num;

// Use foreach to preserve order at execution time.
foreach (var item in parallelQuery)
{
    Console.Write($"{item} ");
}

// Some operators expect an ordered source sequence.
var lowValues = parallelQuery.Take(10);

Örnek 2

Aşağıdaki örnekte, kaynak sırasının muhtemelen sıralanması beklenen bazı sorgu işleçleri gösterilmektedir. Bu işleçler sıralanmamış diziler üzerinde çalışır, ancak beklenmeyen sonuçlara neden olabilir.

// Paste into PLINQDataSample class.
static void SimpleOrdering()
{

    var customers = GetCustomers();

    // Take the first 20, preserving the original order
    var firstTwentyCustomers = customers
                                .AsParallel()
                                .AsOrdered()
                                .Take(20);

    foreach (var c in firstTwentyCustomers)
        Console.Write("{0} ", c.CustomerID);

    // All elements in reverse order.
    var reverseOrder = customers
                        .AsParallel()
                        .AsOrdered()
                        .Reverse();

    foreach (var v in reverseOrder)
        Console.Write("{0} ", v.CustomerID);

    // Get the element at a specified index.
    var cust = customers.AsParallel()
                        .AsOrdered()
                        .ElementAt(48);

    Console.WriteLine($"Element #48 is: {cust.CustomerID}");
}

Bu yöntemi çalıştırmak için, PLINQ Veri Örneği projesindeki PLINQDataSample sınıfına yapıştırın ve F5 tuşuna basın.

Örnek 3

Aşağıdaki örnekte, sorgunun ilk bölümü için sıralamanın nasıl korunduğu, ardından join yan tümcesinin performansını artırmak için sıralamanın nasıl kaldırılacağı ve ardından sıralamanın son sonuç dizisine nasıl yeniden uygulanacağını gösterilmektedir.

// Paste into PLINQDataSample class.
static void OrderedThenUnordered()
{

    var orders = GetOrders();
    var orderDetails = GetOrderDetails();

    var q2 = orders.AsParallel()
       .Where(o => o.OrderDate < DateTime.Parse("07/04/1997"))
       .Select(o => o)
       .OrderBy(o => o.CustomerID) // Preserve original ordering for Take operation.
       .Take(20)
       .AsUnordered()  // Remove ordering constraint to make join faster.
       .Join(
              orderDetails.AsParallel(),
              ord => ord.OrderID,
              od => od.OrderID,
              (ord, od) =>
              new
              {
                  ID = ord.OrderID,
                  Customer = ord.CustomerID,
                  Product = od.ProductID
              }
             )
       .OrderBy(i => i.Product); // Apply new ordering to final result sequence.

    foreach (var v in q2)
        Console.WriteLine($"{v.ID} {v.Customer} {v.Product}");
}

Bu yöntemi çalıştırmak için, PLINQ Veri Örneği projesindeki PLINQDataSample sınıfına yapıştırın ve F5 tuşuna basın.

Ayrıca bkz.


Ek kaynaklar

Belgeler