У меня есть требование, когда мне нужно группировать и выбирать транзакции, в которых количество запусков превышает пороговое значение 10. После превышения порогового значения счетчик будет сброшен ,Как группировать и или выбирать в Linq на основе общего количества
Вот пример того, что я пытаюсь сделать ...
Ниже приведены некоторые сделки:
Id | Amount
1 | 5.50
2 | 4.10
3 | 1.20
4 | 1.05
5 | 3.25
6 | 1.25
7 | 5.15
8 | 8.15
9 | 5.15
В результате я хотел бы достичь, это:
Группа 1:
Id | Amount
1 | 5.50
2 | 4.10
3 | 1.20
Группа 2:
4 | 1.05
5 | 3.25
6 | 1.25
7 | 5.15
Группа 3:
8 | 8.15
9 | 5.15
Я придумал решение, которое использует для цикла и выхода. Вы можете увидеть его на https://dotnetfiddle.net/rcSJO4, а также ниже.
Я просто подумал, было ли более элегантное решение, и если есть умный и читаемый способ, который может быть достигнут с помощью Linq.
Мое решение:
using System;
using System.Linq;
using System.Collections.Generic;
public class Transaction{
public int Id { get; set;}
public decimal Amount { get; set;}
}
public class Program
{
public static void Main()
{
var transactions = new Transaction [] {
new Transaction {Id = 1, Amount = 5.50m},
new Transaction {Id = 2, Amount = 4.10m},
new Transaction {Id = 3, Amount = 1.20m},
new Transaction {Id = 4, Amount = 1.05m},
new Transaction {Id = 5, Amount = 3.25m},
new Transaction {Id = 6, Amount = 1.25m},
new Transaction {Id = 7, Amount = 5.15m},
new Transaction {Id = 8, Amount = 8.15m},
new Transaction {Id = 9, Amount = 5.15m},
};
var grouped = ApplyGrouping(transactions);
foreach(var g in grouped)
{
Console.WriteLine("Total:" + g.Item1);
foreach(var t in g.Item2){
Console.WriteLine(" " +t.Amount);
}
Console.WriteLine("---------");
}
}
private static IEnumerable<Tuple<decimal, IEnumerable<Transaction>>> ApplyGrouping(IEnumerable<Transaction> transactions){
decimal runningTotal = 0m;
decimal threshold = 10m;
var grouped = new List<Transaction>();
foreach(var t in transactions){
grouped.Add(t);
runningTotal += t.Amount;
if (runningTotal <= threshold) continue;
yield return new Tuple<decimal, IEnumerable<Transaction>>(runningTotal, grouped);
grouped.Clear();
runningTotal = 0;
}
}
}
... но он ищет LINQ –