2017-08-16 4 views
4

私はこのようなデータのリストを持っている: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 

私は何を実行したいことは、このように減少し、リストを取得することです:

Prod1: Id=4, Name="Laptop", Active=true 

私がやろうとしています何が私が選択する必要があるということですすべての製品をその名前でグループ化し、すべての製品を真とします。 Bookは1つのfalseを持っているので、Bookを返すべきではありません。

私はこの1つ試してみた:

lstProducts = lstProducts 
       .Where(x => 
        lstProducts 
        .All(c => c.Name == x.Name && c.Active == true)) 
       .GroupBy(c => c.Name).Select(c => c.First()) 
       .ToList(); 

しかし、そのゼロ結果を返します。私がwhere clause where Active == trueをやった場合、それを得るためには、Activeのすべてが真でなければならないので、Book製品を手に入れてください。

答えて

7

を、あなたが探しているものすべての項目は、彼らのNameすることにより、第1のグループにある、のみActiveのためのすべてのtrueを持っており、各グループの最初の項目を取得する最後のものをフィルタリング:

var result = lstProducts.GroupBy(item => item.Name) 
         .Where(group => group.All(item => item.Active) 
         .Select(group => group.First()); 

あなたはのように、グループのためのいくつかの順序を確保したい場合あなたの例:

var result = lstProducts.GroupBy(item => item.Name) 
         .Where(group => group.All(item => item.Active) 
         .Select(group => group.OrderBy(item => item.Id).First()); 
4

グループはまず、フィルタ:彼らはグループ化の前に行ったようにグループ内の項目が互いに同じ順序を持っていることを

lstProducts 
    .GroupBy(c => c.Name) 
    .Where(g => g.All(c => c.Active)) 
    .Select(g => g.First()) 
    .ToList() 

GroupBy保証を。あなたがグループとあなたの元のリストを表すために、最低限のidを持つ要素を選択したい場合は、IDによって順序付けされていない、しかし、あなたはFirstの代わりにMinを使用することができます。

lstProducts 
    .GroupBy(c => c.Name) 
    .Where(g => g.All(c => c.Active)) 
    .Select(g => g.Min(c => c.Id)) 
    .ToList() 
関連する問題