2

これを正しく行うのに問題があり、LINQでアカウントごとにグループ化したトランザクションのリストがあります。これにより、すべてのアカウントの列挙が可能になり、それぞれにトランザクションの列挙が含まれます。そのリストを取得して、各グループのトランザクションの合計で並べ替えたいのですが、機能していないようです。これは、これまでのところです。

var memberTrans = trans.GroupBy(o => o.ShareAccountId);
var transOrdered = memberTrans.OrderByDescending(o => o.Sum(i => i.TransactionAmount));

アイデアは、.First()を実行して、期間中に最も高い純増加があったアカウントを取得し、.Last()を実行して、最も低い純増加があったアカウントを取得することができます。

私が次のようなデータを持っていると仮定します(簡略化)

  • アカウント1:300
  • アカウント1:-300
  • アカウント2:100
  • アカウント3:50
  • アカウント2:-20

したがって、最初のグループ化により、次のことがわかります。

アカウント1:

  • トラン:300
  • トラン:-300

アカウント2:

  • トラン:100
  • トラン:-20

アカウント3:

  • トラン:50

次に、各グループ内のトランザクションのSUMで並べ替えたいので、次のリストを作成します。

アカウント2:

  • トラン:100
  • トラン:-20

アカウント3:

  • トラン:50

アカウント1:

  • トラン:300
  • トラン:-300

うまくいけば、それは十分に明確です、どんな助けも大いに感謝します!

編集:明確にするためのより多くのコード:

var tranOrder = trans.GroupBy(o => o.ShareAccountId).OrderByDescending(g => g.Sum(t => t.TransactionAmount));

        var bigUp = tranOrder.First().First();
        var bigDown = tranOrder.Last().First(); 
        report.BiggestMovementUp = tranOrder.First().Sum(o => o.TransactionAmount);
        report.BiggestMoverUp =
            (bigUp.Member.Title + " " + bigUp.Member.Forename + " " + bigUp.Member.Surname + " - ID " + bigUp.Member.MemberID).Trim();
        report.BiggestMovementDown = tranOrder.Last().Sum(o => o.TransactionAmount);
        report.BiggestMoverDown =
          (bigDown.Member.Title + " " + bigDown.Member.Forename + " " + bigDown.Member.Surname + " - ID " + bigDown.Member.MemberID).Trim();

4

3 に答える 3

1
  var v = (from acc in accs
           group acc by acc.ShareAccountId into g
           orderby g.Sum(x => x.TransactionAmount) descending
           select g.Sum(x => x.TransactionAmount));

それはそれを行う必要があります。選択で必要なことは何でもできます。これもテストしました。

于 2012-11-22T13:52:34.283 に答える
0

これはどう:

internal class Program
    {
        private class AccountOperation
        {
            public int Id { get; set; }
            public int Amount { get; set; }
        }

        private static void Main(string[] args)
        {
            List<AccountOperation> ops = new List<AccountOperation>
            {
                new AccountOperation { Id = 1, Amount = 300},
                new AccountOperation { Id = 1, Amount = -300},
                new AccountOperation { Id = 2, Amount = 100},
                new AccountOperation { Id = 3, Amount = 50},
                new AccountOperation { Id = 2, Amount = -20},
            };

            foreach (var operationsByAccount in ops
                .OrderByDescending(z => z.Amount)  // Orders all amounts descending
                .GroupBy(z => z.Id) // Groups by account ID
                .OrderByDescending(z => z.Sum(z2 => z2.Amount))) // Orders groups of operations per accounts descending (by sum of amounts)
            {
                Console.WriteLine("Operation " + operationsByAccount.Key);
                foreach (var operation in operationsByAccount)
                {
                    Console.WriteLine("\tAmout " + operation.Amount);
                }
            }

            Console.ReadLine();
        }
    }

出力:

  • 操作 2
    • 金額 100
    • 金額 -20
  • 操作 3
    • 金額 50
  • 操作 1
    • 金額 300
    • 金額 -300
于 2012-11-22T14:00:39.833 に答える
0

メソッド チェーンのバージョンを修正するには:

var v = accs.GroupBy(acc => acc.ShareAccountId)
        .OrderByDescending(g => g.Sum(x => x.TransactionAmount))
        .Select( g => g.Sum(x => x.TransactionAmount));

確かに、私はResharperにLINQ構文からこれをさせました:)

于 2012-11-22T15:33:24.923 に答える