开发手册 欢迎您!
软件开发者资料库

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

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

示例数据:

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

使用foreach实现:

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

1、使用Linq的SelectMany方法实现

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

或者

var data = new List
{
new()
{
Id = 1,
ChildIds = new List {123, 234, 345}
},
new()
{
Id = 1,
ChildIds = new List {123, 234, 345}
},
new()
{
Id = 2,
ChildIds = new List {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 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 dict = (from item in data                             from childId in item.ChildIds                             select new { item.Id, childId}                             ).Distinct()                             .ToDictionary(kv => kv.childId, kv => kv.Id);