MST

星途 面试题库

面试题:C# Lambda表达式在异步编程与复杂场景中的深度应用

在一个C#异步项目中,有多个异步任务,每个任务返回一个包含特定数据的Task<List<CustomObject>>,其中CustomObject是自定义类型,包含Name(字符串)和Value(整数)属性。请使用Lambda表达式配合异步编程相关知识,合并所有任务的结果,筛选出Value大于100的CustomObject,然后根据Name进行分组,并计算每组中Value的平均值。请详细说明如何处理异步操作以及Lambda表达式在这个复杂场景中的关键作用。
18.8万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

以下是实现该功能的代码示例及解释:

  1. 使用Task.WhenAll等待所有异步任务完成Task.WhenAll方法允许我们等待多个异步任务完成,并返回一个包含所有任务结果的数组。

  2. 使用Lambda表达式进行数据处理

    • SelectMany用于将所有任务的结果合并成一个单一的序列。
    • Where用于筛选出Value大于100的CustomObject
    • GroupBy用于根据Name进行分组。
    • Select用于计算每组中Value的平均值。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public class CustomObject
{
    public string Name { get; set; }
    public int Value { get; set; }
}

class Program
{
    static async Task Main()
    {
        // 模拟多个异步任务
        List<Task<List<CustomObject>>> tasks = new List<Task<List<CustomObject>>>
        {
            Task.Run(() => GetData1()),
            Task.Run(() => GetData2()),
            Task.Run(() => GetData3())
        };

        // 等待所有任务完成并合并结果
        var allResults = await Task.WhenAll(tasks);

        // 使用Lambda表达式进行数据处理
        var result = allResults
           .SelectMany(list => list)
           .Where(obj => obj.Value > 100)
           .GroupBy(obj => obj.Name)
           .Select(group => new
            {
                GroupName = group.Key,
                AverageValue = group.Average(obj => obj.Value)
            });

        // 输出结果
        foreach (var item in result)
        {
            Console.WriteLine($"Group: {item.GroupName}, Average Value: {item.AverageValue}");
        }
    }

    static List<CustomObject> GetData1()
    {
        return new List<CustomObject>
        {
            new CustomObject { Name = "A", Value = 50 },
            new CustomObject { Name = "B", Value = 150 },
            new CustomObject { Name = "C", Value = 75 }
        };
    }

    static List<CustomObject> GetData2()
    {
        return new List<CustomObject>
        {
            new CustomObject { Name = "A", Value = 120 },
            new CustomObject { Name = "B", Value = 90 },
            new CustomObject { Name = "C", Value = 200 }
        };
    }

    static List<CustomObject> GetData3()
    {
        return new List<CustomObject>
        {
            new CustomObject { Name = "A", Value = 80 },
            new CustomObject { Name = "B", Value = 180 },
            new CustomObject { Name = "C", Value = 110 }
        };
    }
}

关键作用解释

  1. Task.WhenAll:它允许我们等待所有异步任务完成,避免在获取结果前任务还未执行完毕。这是处理异步操作的关键部分,确保我们可以安全地处理所有任务的结果。

  2. Lambda表达式

    • SelectMany:将多个List<CustomObject>合并成一个单一的IEnumerable<CustomObject>序列,方便后续处理。
    • Where:通过筛选条件obj => obj.Value > 100,只保留符合条件的CustomObject
    • GroupBy:按照obj => obj.Name对筛选后的CustomObject进行分组,将相同Name的对象归为一组。
    • Select:在每个分组上计算Value的平均值,生成最终结果。

通过这些异步编程技术和Lambda表达式的组合,我们可以高效地处理复杂的异步数据处理场景。