如何将 IEnumerable<IList<T>> 转换为 IReadOnlyDictionary<string, IEnumerable<IList<T>>>?

How to convert IEnumerable<IList<T>> to IReadOnlyDictionary<string, IEnumerable<IList<T>>>?

假设我有一个 class Telemetry 如下:

public class Telemetry
{
   public string Id { get; set; }
   public AdditionalInfo Info { get; set; }
}

假设我有一个 class: TelemetryCollection 实现了 : IEnumerable<IList<Telemetry>>

我需要 group 基于 Telemetry.IdTelemetryCollection 实例,并获得 Telemetry.IdTelemetryCollection 的映射

如何从 IEnumerable<IList<Telemetry>>>

中获取 IDictionary<string, IEnumerable<IList<Telemetry>>>

假设 TelemetryCollection 包含 arrays/lists 的 Telemetry 个测量值,用于相同的 Id 并且可能重复,您可以:

  1. 使用 group 按第一个数组元素的 Id
  2. 对数组进行分组
  3. 使用ToDictionary将分组数组收集到字典中
var dict=collection.GroupBy(t=>t[0].Id)
                   .ToDictionary(g=>g.Key,
                                 g=>g.AsEnumerable());

编译以下示例:

//Use a record to save keystrokes
public record Telemetry(string Id ,int Info );

IEnumerable<IList<Telemetry>> collection=new List<IList<Telemetry>>{
            new[]{ new Telemetry("A",1),new Telemetry("A",2)},
            new[]{ new Telemetry("B",1),new Telemetry("B",2)},
            new[]{ new Telemetry("A",3),new Telemetry("A",4)}
        };
var dict=collection.GroupBy(t=>t[0].Id)
                   .ToDictionary(g=>g.Key,g=>g.AsEnumerable());
Console.WriteLine(dict);

并打印:

System.Collections.Generic.Dictionary'2[System.String,System.Collections.Generic.IEnumerable'1[System.Collections.Generic.IList`1[ConsoleApp1.Telemetry]]]

序列化 dict 到 JSON 产生:

{
   "A":[
          [{"Id":"A","Info":1},{"Id":"A","Info":2}], 
          [{"Id":"A","Info":3},{"Id":"A","Info":4}]
       ],
   "B":[
          [{"Id":"B","Info":1},{"Id":"B","Info":2}]
       ]
}

如果 TelemetryCollection 中有任何空数组,这将不起作用。如果 FirstOrDefault() 用于检索第一个密钥并默认为 "" 如果存在 none :

,则可以修复此问题
var dict=collection.GroupBy(t=>t.FirstOrDefault()?.Id??"")
                   .ToDictionary(g=>g.Key,
                                 g=>g.AsEnumerable());