使用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

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.