В примере itemList
- это список Item
s, которые содержат ItemId
типа int
, ItemDate
типа DateTime
и ItemStatus
типа string
.
Этот код принимает просроченный элемент (ItemStatus == "Expired"
) с max date для каждого id (ItemId
) и помещает эти элементы в список maxDateForEachExpiredItem
.
itemList.GroupBy(item => item.ItemId).ToList()
.ForEach(itemGroup => maxDateForEachExpiredItem.Add(
itemGroup.ToList()
.Where(itemGroupElement => itemGroupElement.ItemStatus == "Expired")
.OrderByDescending(itemGroupElement => itemGroupElement.ItemDate)
.FirstOrDefault()));
Чтобы получить количество таких элементов, где дата равна "13/11/2020"
maxDateForEachExpiredItem.Where(item => item.ItemDate == DateTime.Parse("11/13/2020")).Count()
Примечание в DateTime.Parse("11/13/2020")
формат даты: месяц / день / год .
Пояснение:
1. itemList
сгруппированы по ItemId
. Эти группы элементов преобразуются в список для итерации по ним.
itemList.GroupBy(item => item.ItemId).ToList()
2. Итерация по каждому элементу (элементы, сгруппированные по ItemId
) списка из части 1 и добавьте что-нибудь в список maxDateForEachExpiredItem
.
.ForEach(itemGroup => maxDateForEachExpiredItem.Add(
3. Элементы, сгруппированные по ItemId
, преобразуются в список для итерации по группе.
itemGroup.ToList()
4. Из группы элементов, сгруппированных по ItemId
, возьмите элементы, где ItemStatus
равно Expired
.
.Where(itemGroupElement => itemGroupElement.ItemStatus == "Expired")
5. Закажите эти товары до ItemDate
, начиная с самой новой даты.
.OrderByDescending(itemGroupElement => itemGroupElement.ItemDate)
6. Наконец, возьмите первый товар из такого упорядоченного списка.
.FirstOrDefault()));
Вот пример целиком.
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp10
{
class Program
{
static void Main(string[] args)
{
List<Item> itemList = new List<Item>
{
new Item(1, "01/05/2015", "Expired"),
new Item(1, "01/06/2015", "Expired"),
new Item(1, "01/12/2020", "Active"),
new Item(2, "01/03/2015", "Expired"),
new Item(2, "01/07/2019", "Expired"),
new Item(2, "01/10/2020", "Active"),
new Item(2, "13/11/2020", "Expired"),
new Item(3, "16/08/2003", "Expired"),
new Item(3, "19/05/2017", "Expired"),
new Item(3, "13/11/2020", "Expired"),
new Item(3, "31/12/2020", "Active")
};
List<Item> maxDateForEachExpiredItem = new List<Item>();
itemList.GroupBy(item => item.ItemId).ToList()
.ForEach(itemGroup => maxDateForEachExpiredItem.Add(
itemGroup.ToList()
.Where(itemGroupElement => itemGroupElement.ItemStatus == "Expired")
.OrderByDescending(itemGroupElement => itemGroupElement.ItemDate)
.FirstOrDefault()));
Console.WriteLine("Max date for each expired item:\n");
foreach (var item in maxDateForEachExpiredItem)
{
Console.WriteLine(item);
}
Console.WriteLine("\nNumber of items where date is 13/11/2020: " +
$"{maxDateForEachExpiredItem.Where(item => item.ItemDate == DateTime.Parse("11/13/2020")).Count()}");
Console.ReadLine();
}
private class Item
{
public int ItemId { get; set; }
public DateTime ItemDate { get; set; }
public string ItemStatus { get; set; }
public Item(int id, string date, string status)
{
ItemId = id;
string[] dateParts = date.Split('/');
ItemDate = new DateTime(int.Parse(dateParts[2]), int.Parse(dateParts[1]), int.Parse(dateParts[0]));
ItemStatus = status;
}
public override string ToString()
{
return $"ItemId = {ItemId}, ItemDate = {ItemDate.ToString("dd/MM/yyyy")}, ItemStatus = {ItemStatus}";
}
}
}
}
Результат