Как найти значения на основе даты вступления в силу в списке C#, используя LinQ - PullRequest
0 голосов
/ 07 января 2020

У меня есть C# список, содержащий следующие значения

*ItemID EffectiveDate   EffectiveDate   Rate** 
Item1   1/1/2017    oz  10
Item1   1/1/2017    lb  150
Item1   1/1/2018    oz  11
Item1   1/1/2018    lb  160
Item1   1/1/2019    oz  12
Item1   1/1/2019    lb  170
Item2   1/1/2017    oz  21
Item2   1/1/2017    lb  220
Item2   1/1/2018    oz  22
Item2   1/1/2018    lb  225
Item2   1/1/2019    oz  23
Item2   1/1/2019    lb  235
и Билл в следующем формате
**Bill Detail**
ItemId, BillDate
Item1, 5/4/2017
Item1, 7/1/2019
Item2, 5/4/2018
Item3, 5/4/2019

Я ищу лямбда-выражение, с помощью которого я могу найти Тарифы Элемент, основанный на дате вступления в силу.

Например, для ItemId = "Item1" и BillDate = "5/4/2017" вывод должен быть

Item1   1/1/2017    oz  10
Item1   1/1/2017    lb  150

Не могли бы вы помочь?

1 Ответ

0 голосов
/ 07 января 2020

Если я правильно понял вопрос, вы хотите вывести ставки для каждого счета, используя максимальное значение 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");
}

Выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...