2012-08-14 27 views
3

的最大我有這個名單如何使用LINQ篩選一組

var commonContractsList = (
     from i in referredDilutions 
     join f in dilutionsList 
      on i.Contract equals f.Contract 
     select f) 
    .ToList(); 

名單commonContractsList有幾個字段和三個特別contractinstalmentamount。我們可以有幾個instalment s一個contract。每個contract/instalment有一個amount

現在,我想要做的是得到,對於每個contract,獲取contract s的所有記錄的列表,其中instalment具有更高的amount

源數據

contract instalment amount 
1   1    100 
1   2    1000 
2   1    100 
3   1    1000 
4   1    200 
4   2    100 
5   1    1000 

所以我需要,

結果

contract instalment amount 
1   2    1000 
2   1    100 
3   1    1000 
4   1    200 
5   1    1000 

我對linq的知識有限,而且我在項目中遇到困難。

任何想法?

回答

4

下面的代碼應該給你預期的結果:

var data = new[] 
{ 
    new { contract = 1, installment = 1, amount = 100}, 
    new { contract = 1, installment = 2, amount = 1000}, 
    new { contract = 2, installment = 1, amount = 100}, 
    new { contract = 3, installment = 1, amount = 1000}, 
    new { contract = 4, installment = 1, amount = 200}, 
    new { contract = 4, installment = 2, amount = 100}, 
    new { contract = 5, installment = 1, amount = 1000}, 
}; 

var result = from d in data 
      group d by d.contract into g 
      let highestInstallment = (from x in g 
             orderby x.amount descending 
             select x).First() 
      select new 
      { 
       contract = g.Key, 
       installment = highestInstallment.installment, 
       amount = highestInstallment.amount 
      }; 

您按contract,然後各組內,你檢查的最高金額。我添加了let子句,因此您不必重複installmentamount的子查詢。

0

修改那些公認的答案誰尋找簡約的例子:

var data = new[] 
{ 
    new { contract = 1, installment = 1, amount = 100}, 
    new { contract = 1, installment = 2, amount = 1000}, 
    new { contract = 2, installment = 1, amount = 100}, 
    new { contract = 3, installment = 1, amount = 1000}, 
    new { contract = 4, installment = 1, amount = 200}, 
    new { contract = 4, installment = 2, amount = 100}, 
    new { contract = 5, installment = 1, amount = 1000}, 
}; 

這給了相同的結果(在另外沒有必要選擇):

var result1 = from d in data 
      group d by d.contract 
      into g 
      select (from x in g 
        orderby x.amount descending 
        select x).First(); 

同樣的是一個LINQ方法寫入鏈(一行代碼):

var result2 = data.GroupBy(d => d.contract).Select(g => g.OrderByDescending(x => x.amount).First()); 

將接受的答案改寫爲od鏈(無論如何,但讓它在這裏)

var result3 = data.GroupBy(d => d.contract) 
       .Select(g => new {g, highestInstallment = (g.OrderByDescending(x => x.amount)).First()}) 
       .Select(@t => new 
       { 
        contract = @t.g.Key, 
        installment = @t.highestInstallment.installment, 
        amount = @t.highestInstallment.amount 
       });