如何将这个嵌套的foreach转换为linq C#

如何将这个嵌套的foreach转换为linq C#,c#,performance,linq,lambda,C#,Performance,Linq,Lambda,当我试图将这个嵌套的foreach转换为LINQ时,我无法做到这一点。我试过几种方法,但什么也没试过。我没有得到这些结果 foreach (string field in extractorResults.Keys) { if (fileResults.ContainsKey(field)) { foreach (ExtractionResult exResult in extractorResults[field]) { fileResults[

当我试图将这个嵌套的foreach转换为LINQ时,我无法做到这一点。我试过几种方法,但什么也没试过。我没有得到这些结果

foreach (string field in extractorResults.Keys) {
    if (fileResults.ContainsKey(field)) {
        foreach (ExtractionResult exResult in extractorResults[field]) {
            fileResults[field].Add(exResult);
        }
    } else
        fileResults.Add(field, extractorResults[field]);
    }
}

似乎您正在尝试“合并”两个词典:

fileResults = fileResults.Concat(extractorResults)
                 .GroupBy(kvp => kvp.Key)
                 .ToDictionary(g => g.Key, g => g.SelectMany(kvp => kvp.Value).ToList());
说明:

  • 从两个字典中获取所有KeyValuePairs
  • 按键对所有KeyValuePair进行分组
  • 创建新字典,其中将包含每个组的条目-相同的键和从分组的KeyValuePairs中选择的所有值的列表。如果不希望结果重复,可以在选择值后添加
    Distinct()
    调用。尽管最初基于foreach的逻辑会产生重复的结果

  • 逐步(我将使用JSON格式显示数据流):

    假设您有两个包含以下数据的字典(这里实际的数据类型无关紧要):

    在连接这些字典之后,您将得到单个键值对序列

     [
        { key:"a", value: [1,2] }, 
        { key: "b", value: [5] },
        { key:"c", value: [7] },  
        { key: "b", value: [3,4] }
     ]
    
    接下来是分组:

     [
        { key: "a", items: [ { key:"a", value: [1,2] } ] },
        { key: "b", items: [ { key: "b", value: [5] }, { key: "b", value: [3,4] },
        { key: "c", items: [ { key:"c", value: [7] } ]
     ]
    
    最后,我们为上面的每个组创建新的字典:

     [
        { key: "a", value: [1, 2] },
        { key: "b", value: [5, 3, 4] },
        { key: "c", value: [7] }
     ]
    

    感谢大家的帮助,最后,由于我无法将字典转换为IDictionary,这对我很有用:

    var mergeResults = fileResults.Concat(extractorResults)
                        .GroupBy(kvp => kvp.Key)
                        .ToDictionary(g => g.Key, g => g.SelectMany(kvp => kvp.Value).ToList())
                        .Where(kvp => !fileResults.ContainsKey(kvp.Key));
    
                    var kvpMergeResults = mergeResults as IList<KeyValuePair<string, List<Result>>> ?? mergeResults.ToList();
                    fileResults.Add(kvpMergeResults.First().Key, kvpMergeResults.First().Value);
    
    var mergeResults=fileResults.Concat(extractorResults)
    .GroupBy(kvp=>kvp.Key)
    .ToDictionary(g=>g.Key,g=>g.SelectMany(kvp=>kvp.Value).ToList())
    .Where(kvp=>!fileResults.ContainsKey(kvp.Key));
    var kvpMergeResults=将结果合并为IList??mergeResults.ToList();
    添加(kvpMergeResults.First().Key,kvpMergeResults.First().Value);
    
    您尝试了什么?具体来说,是以什么方式不起作用的?您可以将实际类型的extractorResults、fileResults和。否则,这是不可能回答你的问题的。工作:),但我仍然有麻烦,当我做演员从名单到IList。谢谢你的帮助。
    var mergeResults = fileResults.Concat(extractorResults)
                        .GroupBy(kvp => kvp.Key)
                        .ToDictionary(g => g.Key, g => g.SelectMany(kvp => kvp.Value).ToList())
                        .Where(kvp => !fileResults.ContainsKey(kvp.Key));
    
                    var kvpMergeResults = mergeResults as IList<KeyValuePair<string, List<Result>>> ?? mergeResults.ToList();
                    fileResults.Add(kvpMergeResults.First().Key, kvpMergeResults.First().Value);