代码之家  ›  专栏  ›  技术社区  ›  blaeiz

如何选择最大日期计数和显示

  •  0
  • blaeiz  · 技术社区  · 4 年前

    我有一个页面,我需要使用数据库表中的最大日期作为标准来显示已过期的交易, 例如: 我的表中有以下日期,另一列中的状态为“已过期”

    13/11/2020
    19/05/2017
    16/08/2003
    

    我正在选择日期为2020年11月13日(最大日期)且状态为过期的所有项目,并在页面中显示匹配的所有记录的数量。 有没有一种方法可以使用orderbydescent或任何其他lambda或linq表达式来实现这一点?

    0 回复  |  直到 4 年前
        1
  •  0
  •   Marko Radivojević    4 年前

    在示例中 itemList 是一个列表 Item s包含 ItemId 类型 int , ItemDate 类型 DateTime ItemStatus 类型 string .

    此代码需要 期满 项目( ItemStatus == "Expired" )与 最大日期 对于每一个 身份证件 ( 项目ID )并将这些元素放置到 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 按以下方式分组 项目ID 这些项目组被转换为列表,以便迭代它们。

    itemList.GroupBy(item => item.ItemId).ToList()
    

    2. 遍历每个元素(按以下方式分组的项目 项目ID )部分列表 1. 并在列表中添加一些内容 每个过期项目的最大日期 .

    .ForEach(itemGroup => maxDateForEachExpiredItem.Add(
    

    3. 按以下方式分组的项目 项目ID 转换为列表,以便在组中迭代。

    itemGroup.ToList()
    

    4. 从项目组中,按以下方式分组 项目ID ,将物品带到 项目状态 Expired .

    .Where(itemGroupElement => itemGroupElement.ItemStatus == "Expired")
    

    5. 按以下方式订购这些项目 项目日期 ,从最新日期开始。

    .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}";
                }
            }
        }
    }
    

    结果

    enter image description here

        2
  •  0
  •   jANVI    4 年前
     public class Transactions
     {
        public DateTime Date { get; set; }
        public string Status { get; set; }
     }
    class Program
    {
        static void Main(string[] args)
        {
            List<Transactions> transactions = new List<Transactions>
            {
                new Transactions {Date = Convert.ToDateTime("13/11/2020") , Status="Expired"},
                new Transactions {Date = Convert.ToDateTime("19/05/2017") , Status="Expired"},
                new Transactions {Date = Convert.ToDateTime("16/08/2003") , Status="Expired"},
                new Transactions {Date = Convert.ToDateTime("13/11/2020") , Status="Expired"},
                new Transactions {Date = Convert.ToDateTime("13/11/2020") , Status="Expired"},
                new Transactions {Date = Convert.ToDateTime("13/11/2020") , Status="Active"},
    
            };
    
            var expiredStatusTransactions = transactions.Where(x => x.Status == "Expired")
                .OrderByDescending(x => x.Date);
            if(expiredStatusTransactions.Any())
            {
                var expiredTransactionDetails = expiredStatusTransactions.Where(x => x.Date == expiredStatusTransactions.FirstOrDefault().Date);
                if(expiredTransactionDetails.Any())
                {
                    foreach(var details in expiredTransactionDetails)
                    {
                        Console.WriteLine($"Date : {details.Date.ToShortDateString()}     Status : {details.Status}");
                    }
    
                    Console.WriteLine($"Total Count : {expiredTransactionDetails.Count()}");
                    Console.ReadLine();
                }
            }
        }
    }