MST

星途 面试题库

面试题:C#中Rx.NET的基本操作符使用

请举例说明C#中Rx.NET里至少三个常用的基本操作符(如Map、Filter、Reduce的类似功能操作符),并简述它们的作用及在实际场景中的应用。同时,用代码示例展示如何使用这些操作符处理一个可观察序列。
20.4万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

1. Select(类似Map)

  • 作用:将可观察序列中的每个元素投影到一个新的形式。它对源序列的每个元素应用一个指定的转换函数,生成一个新的可观察序列,新序列中的元素是原序列元素经过转换后的结果。
  • 实际场景应用:在处理数据集合时,经常需要将对象的某个属性提取出来,或者对对象进行一些简单的转换操作。例如,有一个包含用户信息的可观察序列,每个用户对象包含姓名和年龄,现在只需要获取所有用户的姓名。
  • 代码示例
using System;
using System.Reactive.Linq;

class Program
{
    static void Main()
    {
        var users = new[]
        {
            new { Name = "Alice", Age = 30 },
            new { Name = "Bob", Age = 25 },
            new { Name = "Charlie", Age = 35 }
        };

        var names = users.ToObservable()
           .Select(user => user.Name);

        names.Subscribe(name => Console.WriteLine($"Name: {name}"));
    }
}

2. Where(类似Filter)

  • 作用:过滤可观察序列,仅允许满足指定条件的元素通过。它会对源序列中的每个元素应用一个谓词函数,只有当谓词函数返回 true 时,该元素才会被包含在输出的可观察序列中。
  • 实际场景应用:在处理大量数据时,常常需要筛选出符合特定条件的数据。例如,从一个包含所有订单的可观察序列中,筛选出金额大于100的订单。
  • 代码示例
using System;
using System.Reactive.Linq;

class Program
{
    static void Main()
    {
        var orders = new[]
        {
            new { OrderId = 1, Amount = 50 },
            new { OrderId = 2, Amount = 150 },
            new { OrderId = 3, Amount = 80 }
        };

        var largeOrders = orders.ToObservable()
           .Where(order => order.Amount > 100);

        largeOrders.Subscribe(order => Console.WriteLine($"OrderId: {order.OrderId}, Amount: {order.Amount}"));
    }
}

3. Aggregate(类似Reduce)

  • 作用:对可观察序列应用一个累加器函数,将序列中的元素累积成一个单一的值。累加器函数接受两个参数,第一个是累加的结果,第二个是序列中的下一个元素,每次迭代都返回新的累加结果。
  • 实际场景应用:计算数据集合的总和、平均值等聚合值。例如,计算一个包含产品价格的可观察序列的总价格。
  • 代码示例
using System;
using System.Reactive.Linq;

class Program
{
    static void Main()
    {
        var prices = new[] { 10.0, 20.0, 30.0 };

        var totalPrice = prices.ToObservable()
           .Aggregate((acc, price) => acc + price);

        totalPrice.Subscribe(total => Console.WriteLine($"Total price: {total}"));
    }
}