簡體   English   中英

在多級字典中將foreach嵌套到LINQ

[英]Nested foreach to LINQ in multi-level dictionary

我想在下面使用LINQ簡化嵌套的foreach循環,但找不到答案。 我想我可以使用lambda來使用SelectMany,但不確定。 我想在此嵌套迭代之后創建ClassA對象的列表。 任何幫助表示贊賞:

public List<ClassA> GetLists(Dictionary<string, Dictionary<IEnumerable, Dictionary<string, ClassB>>> groups)
{
    var retOutput = new List<ClassA>();

    foreach (KeyValuePair<string, Dictionary<IEnumerable, Dictionary<string, ClassB>>> group1 in groups)
    {
        foreach (KeyValuePair<IEnumerable, Dictionary<string, ClassB>> group2 in group1.Value)
        {
            foreach (KeyValuePair<string, ClassB> group3 in group2.Value)
            {
                GetList(retOutput, group1.Key, 
                    group2.Key, 
                    group3);
            }
        }
    }

    return retOutput;
}

private static void GetList(List<ClassA> retOutput, 
    string group1Key, 
    IEnumerable group2Key, 
    KeyValuePair<string, ClassB> group3)
{
    List<List<string>> itemIdsLists = group3.Value.ItemId.IntoChunks(2000);
    foreach (var itemIdList in itemIdsLists)
    {
        var currentRequest = new ClassA
        {
            TransactionType = group1Key,
            Filters = new Dictionary<string, object>(),
            ItemIds = new List<string>(),
            PropStreamsDict = new Dictionary<string, Tuple<long, string>>()
        };
        if (group2Key is Dictionary<string, object>)
        {
            currentRequest.Filters = (Dictionary<string, object>)group2Key;
        }
        currentRequest.PropStreamsDict.Add(group3.Key, Tuple.Create(group3.Value.StreamId,
            group3.Value.Uom));
        currentRequest.ItemIds.AddRange(itemIdList);
        retOutput.Add(currentRequest);
    }
}

您應該使用SelectMany來嵌套foreach

這是我想出的:

public List<ClassA> GetLists(Dictionary<string, Dictionary<IEnumerable, Dictionary<string, ClassB>>> groups)
{
    return groups
        .SelectMany(grp1 => grp1.Value
            .SelectMany(grp2 => grp2.Value
                .SelectMany(grp3 => grp3.Value.ItemId
                    .IntoChunks(2000)
                    .Select(itemIdList =>
                        new ClassA
                        {
                            TransactionType = grp1.Key,
                            Filters = grp2.Key is Dictionary<string, object> ? 
                                (Dictionary<string, object>)grp2.Key :
                                new Dictionary<string, object>(),
                            ItemIds = new List<string>(itemIdList),
                            PropStreamsDict = new Dictionary<string, Tuple<long, string>>
                            {
                                { grp3.Key, Tuple.Create(grp3.Value.StreamId, grp3.Value.Uom) }
                            }
                        }
                    )
                )
            )
        )
        .ToList();
}

您沒有發布ClassAClassB所以我不得不猜測。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM