使用LINQ並行查詢生成隨機偶數的C#程式


介紹

在這篇文章中,我們將學習如何編寫一個使用LINQ並行查詢生成隨機偶數的C#程式。讓我們快速回顧一下這門語言。C#程式語言主要用於建立桌面、網際網路和移動應用程式。語言整合查詢(LINQ)是C#的優勢之一。開發人員可以快速訪問各種來源的資料,包括陣列、集合和資料庫。無論資料來源是什麼,它都為資料查詢提供標準語法。由於LINQ和SQL語法相似,開發人員可以輕鬆地使用和理解它們。

問題說明

為了更好地理解,讓我們建立一個使用LINQ並行查詢生成隨機偶數的程式。在這個問題中,它提供了多種使用ParallelQuery<TSource>並行生成隨機偶數的查詢物件選項,這必須作為每個應用程式的第一步完成。此外,我們需要使用Where和Select子句來獲取隨機偶數。

為了完成此任務,將應用以下兩個LINQ子句:

  • Select()

  • Where()

現在讓我們簡要討論這兩個子句。

Select()

在LINQ並行查詢中,“select”子句用於將查詢的結果重塑為新的形式。它常用於描述從查詢返回的結果集的結構和元素。這是一個如何使用LINQ並行查詢的“select”子句的示例。

Int[] num = {1, 2, 3, 4,5};
Var query = from n in num.AsParallel()
   where n % 2 ==0
   Select n * n; 

在這個例子中,我們將使用'AsParallel()'方法來並行化LINQ查詢。我們使用“where”子句選擇numbers陣列,使其只包含偶數整數,然後我們使用“select”子句透過對每個數字平方來投影結果。

“numbers”陣列中偶數的平方值將被放入儲存在結果“query”變數中的“IEnumerable”中。

請記住,當我們在並行LINQ查詢中使用“select”子句時,務必確保投影操作是執行緒安全的,並且不依賴於輸入資料的順序。如果投影操作不是執行緒安全的或依賴於輸入資料的順序,則查詢的結果可能不正確或不可預測。

Where()

LINQ並行查詢中的“where”子句用於根據給定條件過濾集合的元素。它允許你指定一個特定的標準來縮小查詢的結果集。以下是如何在LINQ並行查詢中使用“where”子句的示例。

Int[] num = {1, 2, 3, 4,5};
Var query = from n in num.AsParallel()
   where n % 2 == 0
   Select n;

在這個例子中,使用'AsParallel()'方法使LINQ查詢並行化。接下來,使用“where”子句,我們將選擇“numbers”陣列,使其只包含偶數整數。

結果'query'變數中的'IEnumerable<int>'將只包含'numbers'陣列中的偶數。

請記住,當在並行LINQ查詢中使用“where”子句時,務必確保條件是執行緒安全的,並且不依賴於輸入資料的順序。如果條件不是執行緒安全的或依賴於輸入資料的順序,則查詢的輸出可能不正確或不明確。

使用Where和Select的語法

為了在C#程式中使用LINQ並行查詢生成隨機偶數,我們將使用where和select子句。以下是使用where和select子句解決問題的語法。

IEnumerable<int> variable = ((ParallelQuery<int>)ParallelEnumerable.Range(start, stop)).Where(x => x % 2 == 0).Select(i => i); 

這裡,“start”是序列的第一個整數值,“stop”是要生成的連續整數的數量。

始終記住,如果stop小於0,或者start + stop-1大於MaxValue,則將丟擲ArgumentOutOfRangeException異常。

為了更好地理解這個問題,讓我們來看一個例子:

示例

假設我們需要在一個給定範圍內並行生成一組隨機偶數。因此,我們必須指定範圍(10, 20),並找到所有落在該範圍內的隨機偶數。

輸入

Range(start, stop) = Range(10, 20) 

我們必須在我們當前擁有的範圍內建立所有隨機偶數,這已明確定義。因此,我們的輸出將如下所示:

輸出

1612
14
18
10
20
1416
12
20
10
18

演算法

使用LINQ並行查詢在範圍(10, 20)內生成隨機偶數的C#程式的時間複雜度可以使用以下演算法進行分析:

步驟1 - 首先,我們計算範圍(10,20)內的偶數個數 = 5。

步驟2 - 現在,我們將建立一個並行查詢,使用PLINQ生成5個隨機偶數。

步驟3 - PLINQ並行查詢的開銷是恆定的,對於小的輸入可以忽略。

步驟4 - 生成每個隨機偶數的時間複雜度為O(1)。

步驟5 - 因此,整個程式的時間複雜度為O(5*1) = O(1)。

示例

using System;
using System.Linq;

class TutorialPoint {
   static void Main(string[] args) {
      
      // Calculate the number of even numbers in the range (10, 20)
      int numEven = Enumerable.Range(10, 11).Count(i => i % 2 == 0);
      
      // Generate 5 random even numbers in parallel using PLINQ
      var evenNum = Enumerable.Range(10, 11)
                              .Where(i => i % 2 == 0)
                              .AsParallel() 
                              .OrderBy(i => Guid.NewGuid())
                              .Take(numEven);
      
      // Print the generated even numbers
      foreach (var i in evenNum) {
         Console.WriteLine(i);
      }
   }
}
  • 在此程式碼中,選擇“Enumerable.Range”方法來生成指定範圍(10, 20)內的整數序列。

  • 使用'Count'函式計算範圍內的偶數。

  • 使用'Where'方法過濾掉奇數。

  • 使用'AsParallel'方法建立並行查詢。

  • 使用'OrderBy'方法隨機排列偶數,並且

  • 使用'Take'方法獲取所需的偶數數量。最後,

  • 使用'foreach'迴圈列印生成的偶數。

輸出

20
12
16
18
10
14

時間複雜度

使用LINQ並行查詢在範圍(10, 20)內生成隨機偶數的C#程式的時間複雜度為O(1)。這是因為範圍是固定且小的(只有5個數字),並且在此範圍內生成隨機偶數涉及恆定時間操作。

但是,如果增加範圍,則時間複雜度將取決於範圍內的元素數量和LINQ並行查詢的開銷。如果範圍很大,時間複雜度可能為O(n/log n),其中n是範圍內的元素數量。這是因為LINQ並行查詢將範圍劃分為較小的分割槽,這些分割槽並行處理,從而降低了總體時間複雜度。

結論

在本文中,我們廣泛討論了使用LINQ並行查詢生成隨機偶數的C#程式。在編寫程式碼之前,我們確保能夠理解問題,並討論了將在程式中使用的語法和子句,特別是select和where子句。我們還深入學習了演算法和程式碼,以便更好地理解,並生成了程式碼的相關輸出。最後,我們詳細瞭解了它的時間複雜度。我們希望本文能幫助你提高C#程式設計方面的知識。

更新於:2023年4月4日

瀏覽量:710

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告