Linq获得唯一的客户端



我尝试通过linq获得子元素的子元素的唯一列表。我的意思是,在cities中有barclients。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());

相关内容

最新更新