使用 LINQ 并行查询生成随机偶数的 C# 程序

csharpserver side programmingprogramming

简介

在本文中,我们将学习如何编写使用 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# 程序的了解。


相关文章