使用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#程式設計方面的知識。