使用LINQ获取具有完全相同值的所有属性?

Wil*_* Jr 5 c# linq

我有这样的数据列表:

Prod1: Id=1,  Name="Book",    Active=true
Prod2: Id=2,  Name="Book",    Active=false
Prod3: Id=3,  Name="Book",    Active=true
Prod4: Id=4,  Name="Laptop",  Active=true
Prod5: Id=5,  Name="Laptop",  Active=true
Prod6: Id=6,  Name="Laptop",  Active=true
Run Code Online (Sandbox Code Playgroud)

我想要执行的是获得这样的简化列表:

Prod1: Id=4, Name="Laptop", Active=true
Run Code Online (Sandbox Code Playgroud)

我想要做的是我需要按名称选择所有产品组,并返回所有真实的产品.由于Book有一个假,它不应该返回Book.

我试过这个:

lstProducts = lstProducts 
                .Where(x =>
                    lstProducts 
                   .All(c => c.Name == x.Name && c.Active == true))
                .GroupBy(c => c.Name).Select(c => c.First())
                .ToList();
Run Code Online (Sandbox Code Playgroud)

但它的归零结果.如果我这样做where clause where Active == true,它会得到一个Book产品,因为它的所有Active都应该是真的才能得到它.

Gil*_*een 8

你要找的是首先按照它们对所有项目进行分组Name,然后仅筛选那些包含所有true项目Active并最后检索每个组的第一个项目的项目:

var result = lstProducts.GroupBy(item => item.Name)
                        .Where(group => group.All(item => item.Active)
                        .Select(group => group.First());
Run Code Online (Sandbox Code Playgroud)

如果您想确保该组的某些排序,如您的示例所示:

var result = lstProducts.GroupBy(item => item.Name)
                        .Where(group => group.All(item => item.Active)
                        .Select(group => group.OrderBy(item => item.Id).First());
Run Code Online (Sandbox Code Playgroud)