using System.Collections.Generic;
public static void Main()
var estados = new List<Estado>
new Estado { Nome = "estado 1", Id = 52,
Cidades = new List<Cidade>()
new Cidade{ Id = 1, Nome="Cidade001"},
new Cidade{ Id = 2, Nome=null},
new Cidade{ Id = 3, Nome="Cidade003"},
Cidades = new List<Cidade>()
new Cidade{ Id = 4, Nome="Cidade111"},
new Cidade{ Id = 5, Nome=null},
new Cidade{ Id = 6, Nome="Cidade113"},
new Estado { Id = 22, Nome = "estado 3",
Cidades = new List<Cidade>()
new Cidade{ Id = 7, Nome="Cidade221"},
new Cidade{ Id = 8, Nome=null},
new Cidade{ Id = 9, Nome="Cidade223"},
new Estado { Id = 33, Nome = "estado 4",
Cidades = new List<Cidade>()
new Cidade{ Id = 10, Nome="Cidade331"},
new Cidade{ Id = 11, Nome=null},
new Cidade{ Id = 12, Nome="CIdade333"},
var cidades = estados.SelectMany(x => x.Cidades.Where(c => c.Nome != null));
var result = from r in estados
select new { cidades = r.Cidades.Intersect(cidades), id = r.Id, nome = r.Nome };
var ident2 = $" {ident1}";
var ident3 = $" {ident2}";
foreach (var item in result)
Console.WriteLine($"{ident1}{item.nome}");
foreach (var cidade in item.cidades)
Console.WriteLine($"{ident3}{cidade.Id}");
Console.WriteLine($"{ident3}{cidade.Nome}");
public int Id { get; set; }
public string Nome { get; set; }
public List<Cidade> Cidades { get; set; }
public int Id { get; set; }
public string Nome { get; set; }