如何将 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.Id
的 TelemetryCollection
实例,并获得 Telemetry.Id
和 TelemetryCollection
的映射
如何从 IEnumerable<IList<Telemetry>>>
中获取 IDictionary<string, IEnumerable<IList<Telemetry>>>
假设 TelemetryCollection
包含 arrays/lists 的 Telemetry
个测量值,用于相同的 Id
并且可能重复,您可以:
- 使用 group 按第一个数组元素的
Id
对数组进行分组
- 使用
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());
假设我有一个 class Telemetry
如下:
public class Telemetry
{
public string Id { get; set; }
public AdditionalInfo Info { get; set; }
}
假设我有一个 class: TelemetryCollection
实现了 : IEnumerable<IList<Telemetry>>
我需要 group 基于 Telemetry.Id
的 TelemetryCollection
实例,并获得 Telemetry.Id
和 TelemetryCollection
的映射
如何从 IEnumerable<IList<Telemetry>>>
IDictionary<string, IEnumerable<IList<Telemetry>>>
假设 TelemetryCollection
包含 arrays/lists 的 Telemetry
个测量值,用于相同的 Id
并且可能重复,您可以:
- 使用 group 按第一个数组元素的
Id
对数组进行分组
- 使用
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());