我尝试通过linq获得子元素的子元素的唯一列表。我的意思是,在cities
中有bar
的client
s。bar可以有相同的客户端
我需要有一个唯一的客户端列表,所以我这样做(代码在这里):
public class Program
{
class Client { public int Id { get; set; } }
class Bar
{
public int Id { get; set; }
public ICollection<Client> Clients;
}
class City
{
public int Id { get; set; }
public ICollection<Bar> Bars;
}
public static void Main()
{
var clients = new Client[]
{
new Client() { Id = 5 },
new Client() { Id = 9 }
};
Bar b1 = new Bar() { Id = 1, Clients = clients };
Bar b2 = new Bar() { Id = 2, Clients = clients };
City c1 = new City() { Id = 1, Bars = new Bar[] { b1, b2 } };
City c2 = new City() { Id = 2, Bars = new Bar[] { } };
List<City> cities = new List<City>() { c1, c2 };
var barClients = cities.Select(c => c.Bars.Select(b => b.Clients));
foreach (var c in barClients)
Console.WriteLine(c.Id);
}
}
然而,这不起作用(它说的是关于集合的集合)
也许你想要这样的东西?
var barClients = cities.SelectMany(s => s.Bars.SelectMany(x => x.Clients)).Distinct();
关于SelectMany的更多信息
Distinct将"移除";复制客户
如果不想使用Distinct,也可以使用GroupBy和Select
var barClients = cities.SelectMany(s => s.Bars.SelectMany(x => x.Clients))
.GroupBy(x => x.Id)
.Select(x => x.First());