面试题答案
一键面试以下是实现该功能的代码示例及解释:
-
使用
Task.WhenAll
等待所有异步任务完成:Task.WhenAll
方法允许我们等待多个异步任务完成,并返回一个包含所有任务结果的数组。 -
使用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 }
};
}
}
关键作用解释
-
Task.WhenAll
:它允许我们等待所有异步任务完成,避免在获取结果前任务还未执行完毕。这是处理异步操作的关键部分,确保我们可以安全地处理所有任务的结果。 -
Lambda表达式:
SelectMany
:将多个List<CustomObject>
合并成一个单一的IEnumerable<CustomObject>
序列,方便后续处理。Where
:通过筛选条件obj => obj.Value > 100
,只保留符合条件的CustomObject
。GroupBy
:按照obj => obj.Name
对筛选后的CustomObject
进行分组,将相同Name
的对象归为一组。Select
:在每个分组上计算Value
的平均值,生成最终结果。
通过这些异步编程技术和Lambda表达式的组合,我们可以高效地处理复杂的异步数据处理场景。