.NET Core(C#) 将List列表数据通过Linq转换创建字典(Dictionary)的方法及示例代码

本文主要介绍.NET Core(C#)中,通过Linq(System.Linq)方法将对象的List列表数据,转换创建成字典(Dictionary)的方法,以及相关的示例代码。

示例数据:

public class Data
{
    public int Id { get; set; }
    public List<int> ChildIds { get; set; }
}
var data = new List<Data>
{
new()
{
Id = 1,
ChildIds = new List<int> {123, 234, 345}
},
new()
{
Id = 1,
ChildIds = new List<int> {123, 234, 345}
},
new()
{
Id = 2,
ChildIds = new List<int> {678, 789}
},
};

使用foreach实现:

var dict = new Dictionary<int, int>();
foreach (var dataItem in data)
{
foreach (var child in dataItem.ChildIds)
{
dict[child] = dataItem.Id;
}
}

1、使用Linq的SelectMany方法实现

var data = new List<Data>
{
new()
{
Id = 1,
ChildIds = new List<int> {123, 234, 345}
},
new()
{
Id = 1,
ChildIds = new List<int> {123, 234, 345}
},
new()
{
Id = 2,
ChildIds = new List<int> {678, 789}
},
};
ILookup<int, int> idLookup = data
.SelectMany(d => d.ChildIds.Select(c => (Id:d.Id, ChildId:c)))
.ToLookup(x => x.ChildId, x => x.Id);
Dictionary<int, int> dict = idLookup.ToDictionary(x => x.Key, x => x.First());

或者

var data = new List<Data>
{
new()
{
Id = 1,
ChildIds = new List<int> {123, 234, 345}
},
new()
{
Id = 1,
ChildIds = new List<int> {123, 234, 345}
},
new()
{
Id = 2,
ChildIds = new List<int> {678, 789}
},
};
var dict = data .SelectMany(d => d.ChildIds, (data, childId) => new {data.Id, childId}) .Distinct() .ToDictionary(x => x.childId, x => x.Id); dict.Keys .ToList() .ForEach(k => Console.WriteLine($"{k} {dict[k]}"));

或者

var list = new List<(int Id, int[] ChildIds)>()
{
(1, new []{10, 11}),
(2, new []{11, 12})
};
var result = list
.SelectMany(pair => pair.ChildIds.Select(childId => (childId, pair.Id)))
.ToDictionary(p => p.childId, p => p.Id);

2、使用Linq语法实现

Dictionary<int, int> dict2 = (from item in data
                                from childId in item.ChildIds
                                group new { item.Id, childId } by childId into g
                                select g.Last()
                                ).ToDictionary(kv => kv.childId, kv => kv.Id);

或者

Dictionary<int, int> dict = (from item in data
                             from childId in item.ChildIds
                             select new { item.Id, childId}
                             ).Distinct()
                             .ToDictionary(kv => kv.childId, kv => kv.Id);


推荐阅读
cjavapy编程之路首页