2017-02-20 170 views
1

我有一些創建新的匿名類型(集合)的小C#代碼。集合中的條目僅與Child.Value有所不同。我想實現的目標是:通過獲取每個父項中每個子項的最高值的父子對,減少沒有子項重複項的父子對的計數。孩子是由孩子ID區分。篩選匿名類型集合

var familyPairs = family 
     .SelectMany(parent => parent.Children, (parent, child) => 
       new { 
        Parent = parent, 
        Child = child 
        }) 
     .OrderByDescending(pair => pair.Child.Value); 

回答

2

如果您需要單親孩子對每一個父母,那麼你可以使用簡單的選擇:

family.Select(p => new { 
    Parent = p, 
    Child = p.Children.OrderByDescending(c => c.Value).FirstOrDefault() 
}) 

或者,如果你不想讓家長對孩子沒有 - 濾除兒童免費家長:

family.Where(p => p.Children.Any()).Select(p => new { 
    Parent = p, 
    Child = p.Children.OrderByDescending(c => c.Value).First() 
}) 

您更新後事實證明,你需要的SelectMany,但您可以通過ID需要一羣孩子並從每個組的孩子與最大值選擇:

family.SelectMany(
    p => p.Children.GroupBy(c => c.Id) 
        .Select(g => g.OrderByDescending(c => c.Value).First()), 
    (p,c) => new { Parent = p, Child = c }) 
+0

我會嘗試一下。 :) –

+0

對不起,我編輯我的問題,如果你出來一些關於編輯。但我仍然要試試這個:) –

+0

@CeylanMumunKocabaş從你的編輯中不清楚 - 如果你在父母的孩子列表中有幾個同樣的孩子,你怎麼區分兩個不同的孩子? –

2

如果你只想要孩子最大,排序是在浪費時間(N日誌N操作爲孩子的列表)。相反,您應該使用Aggregate()擴展方法遍歷每個子項列表,以獲取最大值的子項。

family.Select(p => new { 
Parent = p, 
Child = p.Children.Aggregate((c1, c2) => c1.Value > c2.Value ? c1 : c2)}) 

參見:How can I get LINQ to return the object which has the max value for a given property?

+0

另外,我應該指出,如果多個孩子分享最大值,則>和> =運算符之間存在很大差異。 >運算符將選擇最大值的最後一個孩子,>> =將選擇第一個孩子。 – plushpuffin