Если я правильно понял вопрос, вы хотите вывести ставки для каждого счета, используя максимальное значение EffecitveDate
, которое меньше или равно дате счета.
Если это так, вот один из способов. Во-первых, давайте определим классы, чтобы убедиться, что мы находимся на одной странице:
public class Item
{
public string Id { get; set; }
public DateTime EffectiveDate { get; set; }
public string UnitOfMeasure { get; set; }
public int Rate { get; set; }
public Item() { }
public Item(string id, DateTime effectiveDate, string unitOfMeasure, int rate)
{
Id = id;
EffectiveDate = effectiveDate;
UnitOfMeasure = unitOfMeasure;
Rate = rate;
}
public override string ToString()
{
return $"{Id} {EffectiveDate.ToShortDateString()} {UnitOfMeasure} {Rate}";
}
}
public class Bill
{
public string ItemId { get; set; }
public DateTime Date { get; set; }
public override string ToString()
{
return $"{ItemId} {Date.ToShortDateString()}";
}
}
Далее, давайте определим наши списки:
var items = new List<Item>
{
new Item("Item1", new DateTime(2017, 1, 1), "oz", 10),
new Item("Item1", new DateTime(2017, 1, 1), "lb", 150),
new Item("Item1", new DateTime(2018, 1, 1), "oz", 11),
new Item("Item1", new DateTime(2018, 1, 1), "lb", 160),
new Item("Item1", new DateTime(2019, 1, 1), "oz", 12),
new Item("Item1", new DateTime(2019, 1, 1), "lb", 170),
new Item("Item2", new DateTime(2017, 1, 1), "oz", 21),
new Item("Item2", new DateTime(2017, 1, 1), "lb", 220),
new Item("Item2", new DateTime(2018, 1, 1), "oz", 22),
new Item("Item2", new DateTime(2018, 1, 1), "lb", 225),
new Item("Item2", new DateTime(2019, 1, 1), "oz", 23),
new Item("Item2", new DateTime(2019, 1, 1), "lb", 235),
};
var bills = new List<Bill>
{
new Bill {ItemId = "Item1", Date = new DateTime(2017, 5, 4)},
new Bill {ItemId = "Item1", Date = new DateTime(2019, 7, 1)},
new Bill {ItemId = "Item2", Date = new DateTime(2018, 5, 4)},
new Bill {ItemId = "Item3", Date = new DateTime(2019, 5, 4)},
};
Теперь, если они верны, вот таким образом, вы можете распечатать вывод для каждого счета. Для каждого счета мы сначала получаем элементы, которые соответствуют ItemId
, и где EffectiveDate
меньше или равно счету Date
. Затем мы группируем их по EffectiveDate
, так что элементы с одинаковой датой находятся в одной группе, затем мы можем выбрать самый большой из них, если мы OrderBy
EffectiveDate
, а затем взять LastOrDefault
:
foreach (var bill in bills)
{
var rates = items
.Where(item => item.Id == bill.ItemId && item.EffectiveDate <= bill.Date)
.GroupBy(item => item.EffectiveDate)
.OrderBy(grp => grp.Key)
.LastOrDefault();
Console.WriteLine($"For bill {bill}: ");
Console.WriteLine(rates == null
? " - [No rates]\r\n"
: $" - {string.Join("\r\n - ", rates)}\r\n");
}
Выход