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

C# 希望从两层不同的嵌套列表中获取信息,c#,linq,nested-lists,todictionary,C#,Linq,Nested Lists,Todictionary,我正在尝试使用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 all

我正在尝试使用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);  
        }

您可以使用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);
}
public void组合natsandpets()
{
//创建数据
var tenants=Enumerable.Range(0,10)。选择(=>newtenant()
{
PetList=Enumerable.Range(0,5)。选择(=>new Pet()).ToList()
});
var tenantsAndPets=租户
.SelectMany(t=>
t、 选择(p=>newkeyvaluepair(
$“{t.BuildingNumber}-{t.Name}-{p.Age}”,p)))
.ToDictionary(kvp=>kvp.Key,kvp=>kvp.Value);
}

您可以使用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);
}
public void组合natsandpets()
{
//创建数据
var tenants=Enumerable.Range(0,10)。选择(=>newtenant()
{
PetList=Enumerable.Range(0,5)。选择(=>new Pet()).ToList()
});
var tenantsAndPets=租户
.SelectMany(t=>
t、 选择(p=>newkeyvaluepair(
$“{t.BuildingNumber}-{t.Name}-{p.Age}”,p)))
.ToDictionary(kvp=>kvp.Key,kvp=>kvp.Value);
}

非常感谢!编译器不喜欢$“{t.BuildingNumber}-{t.Name}-{p.Age},关于$的一些东西。我把它改为(tenant.BuildingNumber+“-”+tenant.Name+“-”+pet.Age,pet),它工作了。非常感谢!编译器不喜欢$“{t.BuildingNumber}-{t.Name}-{p.Age},关于$的一些东西。我把它改为(tenant.BuildingNumber+“-”+tenant.Name+“-”+pet.Age,pet),它成功了。
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);
}