C# 关于LINQ和LAMBDA链的使用
我试图了解Linq链或lambda链是如何工作的,但我无法理解。我在下面编写了一个示例代码。实际上,我可以像那样长时间运行代码,但我想学习另一种方法。我使用AWS SDK编写代码。我试图在使用lambda链时,使用完全相同的方式管理单行代码。有一个“_dict”变量,用于我想从lambda链中获得的内容。我必须使用多个“GroupBy”并为“reservedList”变量选择命令,但我如何才能做到这一点C# 关于LINQ和LAMBDA链的使用,c#,.net,linq,lambda,C#,.net,Linq,Lambda,我试图了解Linq链或lambda链是如何工作的,但我无法理解。我在下面编写了一个示例代码。实际上,我可以像那样长时间运行代码,但我想学习另一种方法。我使用AWS SDK编写代码。我试图在使用lambda链时,使用完全相同的方式管理单行代码。有一个“_dict”变量,用于我想从lambda链中获得的内容。我必须使用多个“GroupBy”并为“reservedList”变量选择命令,但我如何才能做到这一点 Dictionary<string, Dictionary<string, in
Dictionary<string, Dictionary<string, int>> _dict = new Dictionary<string, Dictionary<string, int>>();
//Dict<AvailabilityZone, Dict<InstanceType, Count>>
var reservedList = _ec2Client.DescribeReservedInstances(new DescribeReservedInstancesRequest { }).ReservedInstances
.GroupBy(q => q.AvailabilityZone);
foreach (var _availabilityZoneItems in reservedList)
{
if (!_dict.ContainsKey(_availabilityZoneItems.Key))
_dict.Add(_availabilityZoneItems.Key, new Dictionary<string, int>());
var typeGroup = _availabilityZoneItems.GroupBy(q => q.InstanceType);
foreach (var _type in typeGroup)
{
var selectionCount = _type.Where(q => q.State == ReservedInstanceState.Active).Sum(q=>q.InstanceCount);
_dict[_availabilityZoneItems.Key].Add(_type.Key, selectionCount);
}
}
您可能正在查找可枚举的
。SelectMany()
这将使列表中的列表变平
类似:(未经测试/尚未完成)
也许这会给你指明正确的方向。我通常会使用Linq来实现这一点。我会沿着这些思路尝试一些东西
_ec2Client.DescribeReservedInstances(new DescribeReservedInstancesRequest()).ReservedInstances
.GroupBy(q => q.AvailabilityZone)
.ToList()
.ForEach (_availabilityZoneItems => {
_availabilityZoneItems.GroupBy(q => q.InstanceType)
.ToList()
.ForEach(_type => {
_dict[_availabilityZoneItems.Key][_type.Key] = _type.Where(q => q.State == ReservedInstanceState.Active).Count();
});
});
这是未经测试的只是为了澄清一下,您想一直使用lamda吗?是的,您是正确的。我想做那样的事。var reservedList=_ec2Client.DescribeServedInstances(新的DescribeServedInstancesRequest{}).ReservedInstances.GroupBy(q=>q.AvailabilityZone).GroupBy(q=>q.InstanceType).选择(…);但不幸的是,您无法管理它。您可以始终使用
.ToList()
强制转换IEnumerable
s,并使用.ForEach(x=>)
(或为IEnumerable
编写ForEach扩展)来替换循环,但我建议不要这样做(搜索LINQ-ForEach vs-loop)。是否应\u availabilityZoneItems
为\u availabilityZone
?如果不是的话,它来自哪里。是的,我更改了代码。现在,正确的答案是:)
var typeGroup = _ec2Client
.DescribeReservedInstances(new DescribeReservedInstancesRequest {})
.ReservedInstances.GroupBy(q => q.AvailabilityZone)
.SelectMany(availabilityZone =>
availabilityZone
.GroupBy(q => q.InstanceType)
.Select(type => new
{
AvailabilityZone = availabilityZone,
Type = type
}));
foreach (var _type in typeGroup)
{
var selectionCount = _type.Type.Where(q => q.State == ReservedInstanceState.Active).Count();
_dict[_type.AvailabilityZoneItems.Key][_type.Type.Key] = selectionCount;
}
_ec2Client.DescribeReservedInstances(new DescribeReservedInstancesRequest()).ReservedInstances
.GroupBy(q => q.AvailabilityZone)
.ToList()
.ForEach (_availabilityZoneItems => {
_availabilityZoneItems.GroupBy(q => q.InstanceType)
.ToList()
.ForEach(_type => {
_dict[_availabilityZoneItems.Key][_type.Key] = _type.Where(q => q.State == ReservedInstanceState.Active).Count();
});
});