希望从两个不同的嵌套列表层获取信息

问题描述 投票:0回答:1

我正在尝试使用LINQ的2个foreach循环简化查询。

我有以下代码:

// Create a dictionary of all the pets where the key is building # + owner name + pet's age
Dictionary<string, Pet> petDictionary = new Dictionary<string, Pet>();
        foreach (Tenant tenant in allTenants){
            foreach (Pet pet in tenant.PetList){
                petDictionary.Add(tenant.BuildingNumber  + "-" + tenant.Name + "-" + pet.Age, pet);
            }
        }
        foreach (KeyValuePair<string, Pet> petKvp in petDictionary){
            Console.WriteLine("Name: {0,20} | secret Id: {1}", petKvp.Value.Name, petKvp.Key);  
        }

该代码有效,但我想使用ToDictionary替换上面的嵌套foreach循环。有人会让我知道如何使用LINQ进行此操作吗?

我已经尝试了几件事,但是我找不到如何从同一LINQ查询中的租户列表和宠物列表中获取信息。

租户类别:

public class Tenant
{
    // Attributes
    public string Name{ get; set;}
    public int BuildingNumber{ get; set;}
    public List<Pet> PetList{get; set;}
}

宠物班:

public class Pet
{
    // Attributes
    public string Name{ get; set;}
    public int Age{ get; set;}
}
c# linq nested-lists todictionary
1个回答
1
投票

您可以使用LINQ进行此操作并生成新字典,而无需事先声明字典并向其中添加项目。

public void CombineTenatsAndPets()
{
    //Create data
    var tenants = Enumerable.Range(0, 10).Select(_ => new Tenant()
    {
        PetList = Enumerable.Range(0, 5).Select(_ => new Pet()).ToList()
    });

    var tenantsAndPets = tenants
        .SelectMany(t =>
            t.PetList.Select(p => new KeyValuePair<string, Pet>(
                    $"{t.BuildingNumber}-{t.Name}-{p.Age}", p)))
        .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
}
© www.soinside.com 2019 - 2024. All rights reserved.