3

私はこのリストを持っています

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

リストcommonContractsListにはいくつかのフィールドがあり、特に 、contract、 の3 つがinstalmentありamountます。instalment1 つの に対して複数の を使用できますcontract。すべてのcontract/instalmentにはamount.

今、私がやりたいことは、各について、より高い を持つs のcontractすべてのレコードのリストを取得することです。contractinstalmentamount

ソースデータ

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

2 に答える 2

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

于 2012-08-14T10:22:55.820 に答える
1

ミニマリストの例を探している人のために、受け入れられた回答を変更します。

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 メソッド チェーン (1 行のコード) で記述します。

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

メソッドチェーンとして書き直された受け入れられた回答(とにかく多くのコードですが、ここに置いておきます)

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
                }); 
于 2016-12-28T15:10:39.650 に答える