【问题标题】:Linq get unique clients [closed]Linq获得独特的客户[关闭]
【发布时间】:2021-01-28 16:43:37
【问题描述】:

我尝试通过 linq 获取孩子的孩子的唯一列表。我的意思是,我有clients 和bars 住在cities。酒吧可以拥有相同的客户。

我需要一个唯一的客户列表,所以我喜欢这样(代码小提琴here):

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

但这不起作用(它说的是集合的集合)

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    可能你想要这样的东西?

    var barClients = cities.SelectMany(s => s.Bars.SelectMany(x => x.Clients)).Distinct();
    

    更多关于SelectMany

    Distinct 将“删除”重复的客户端

    【讨论】:

    • 所以,我只是选择了,它似乎没有将集合作为返回类型......
    • 好答案! @Serge,如果有重复的客户端对象,也许您还想实现 IEquatable 以在 Id 上获取 dinstict。 docs.microsoft.com/en-us/dotnet/api/…
    • @TorbjörnHansson 好话,所以我做了public bool Equals(BaseEntity other) { return this.Id.Equals(other.Id) &amp;&amp; this.Id != 0; }
    • 是的,但在简单的场景中默认相等比较器就足够了,除非您假设向客户端类添加更多属性
    • @janek9971 默认场景是否使用Id 进行比较?
    【解决方案2】:

    如果不想使用 Distinct,也可以使用 GroupBy 和 Select

    var barClients = cities.SelectMany(s => s.Bars.SelectMany(x => x.Clients))
                           .GroupBy(x => x.Id)
                           .Select(x => x.First());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 2011-03-26
      相关资源
      最近更新 更多