C# 关于LINQ和LAMBDA链的使用

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

我试图了解Linq链或lambda链是如何工作的,但我无法理解。我在下面编写了一个示例代码。实际上,我可以像那样长时间运行代码,但我想学习另一种方法。我使用AWS SDK编写代码。我试图在使用lambda链时,使用完全相同的方式管理单行代码。有一个“_dict”变量,用于我想从lambda链中获得的内容。我必须使用多个“GroupBy”并为“reservedList”变量选择命令,但我如何才能做到这一点

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();
                                     });
           });