2012-08-14 30 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 
       });