使用 LINQ 并行查询生成随机偶数的 C# 程序
简介
在本文中,我们将学习如何编写使用 LINQ 并行查询生成随机偶数的 C# 程序。让我们快速回顾一下这门语言。C# 编程语言主要用于创建桌面、互联网和移动应用程序。语言集成查询(也称为 LINQ)是 C# 的优势之一。开发人员可以快速访问来自各种来源的数据,包括数组、集合和数据库。无论数据源是什么,它都为数据查询提供了标准语法。由于 LINQ 和 SQL 共享相似的语法,开发人员可以轻松使用和理解它们。
问题解释
为了更好地理解,让我们创建一个使用 LINQ 并行查询生成随机偶数的程序。在这个问题中,它给出了许多查询对象的选项,这些对象使用 ParallelQuery TSource 使用 LINQ 并行生成随机偶数,这是每个应用程序的第一步。此外,我们需要使用 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"子句选择数字数组以仅包含偶数整数,然后使用"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"变量中的"IEnumerableint>"将仅包含"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) { // 计算范围 (10, 20) 内的偶数个数 int numEven = Enumerable.Range(10, 11).Count(i => i % 2 == 0); // 使用 PLINQ 并行生成 5 个随机偶数 var evenNum = Enumerable.Range(10, 11) .Where(i => i % 2 == 0) .AsParallel() .OrderBy(i => Guid.NewGuid()) .Take(numEven); // 打印生成的偶数 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# 程序的了解。