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