Нужна информация из двух разных уровней вложенных списков - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь упорядочить запрос, используя 2 цикла foreach, используя LINQ.

У меня есть следующий код:

// 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;}
}

1 Ответ

1 голос
/ 27 января 2020

Вы можете сделать это с помощью 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);
}
...