在示例中,itemList 是一个 Items 列表,其中包含 int 类型的 ItemId、DateTime 类型的 ItemDate 和 string 类型的 ItemStatus。
此代码为每个 id (ItemId) 获取带有 max date 的 expired 项 (ItemStatus == "Expired") 并将这些元素放置到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. 遍历 1 部分列表中的每个元素(按 ItemId 分组的项目)并添加一些内容到列表 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}";
}
}
}
}
结果