如何从每日存储的库存数据中获取商品价格最后变动日期?
如何提取商品价格最后一次变动的日期?
我明白你现在的需求:从每日存储的Stock、Price、Saved数据中,找到商品最后一次价格发生变动的日期——也就是价格从旧值切换到当前最新值的那一天。在你的示例数据里,期望得到的是8/7/2019 12:01:01 AM,这是价格从28首次变为31的日期。
你的原代码问题出在哪?
你的原代码输出错误,大概率是因为数据没有按日期从新到旧排序,或者循环逻辑没有从最新的记录开始往后比对。如果数据库返回的记录是按日期从旧到新排列的,你的循环会在第一次碰到价格变化时就输出旧的日期,而不是我们需要的最后一次变动日期。
另外,你当前用字符串存储日期,无法正确进行排序和比较,这也是潜在的问题点。
修正后的解决方案
步骤1:先确保数据按日期从新到旧排序
首先把字符串类型的saved转换为DateTime,再按日期降序排列,保证最新的记录在最前面:
// 将字符串日期转为DateTime,再按日期从新到旧排序 var sortedInv = inv.OrderByDescending(x => DateTime.Parse(x.saved)).ToList();
步骤2:遍历找到最后一次变动的日期
从最新的记录开始,找到第一个价格和当前最新价格不同的记录,它的前一条记录的日期就是最后一次变动的日期;如果所有价格都相同,说明该商品价格从未变动过。
修正后的完整代码:
namespace StackOverFlowQ2 { class Program { public class Inventory { public string stock { get; set; } public string price { get; set; } public string saved { get; set; } } static void Main(string[] args) { var inv = new List<Inventory> { new Inventory { stock = "Apple", price = "31", saved = "8/10/2019 12:01:01 AM" }, new Inventory { stock = "Apple", price = "31", saved = "8/9/2019 12:01:01 AM" }, new Inventory { stock = "Apple", price = "31", saved = "8/8/2019 12:01:01 AM" }, new Inventory { stock = "Apple", price = "31", saved = "8/7/2019 12:01:01 AM" }, new Inventory { stock = "Apple", price = "28", saved = "8/6/2019 12:01:01 AM" }, new Inventory { stock = "Apple", price = "28", saved = "8/5/2019 12:01:01 AM" }, new Inventory { stock = "Apple", price = "28", saved = "8/4/2019 12:01:01 AM" } }; #region 修正后的Solution // 1. 按日期从新到旧排序 var sortedInv = inv.OrderByDescending(x => DateTime.Parse(x.saved)).ToList(); if (!sortedInv.Any()) return; // 2. 获取当前最新价格 var latestPrice = sortedInv.First().price; DateTime? lastChangeDate = null; // 3. 遍历查找第一个价格不同的记录 for (int i = 1; i < sortedInv.Count; i++) { if (sortedInv[i].price != latestPrice) { // 前一条记录的日期就是最后一次变动的日期 lastChangeDate = DateTime.Parse(sortedInv[i-1].saved); break; } } // 4. 输出结果 if (lastChangeDate == null) { Console.WriteLine($"商品{sortedInv.First().stock}价格从未变动过,最早记录日期:{sortedInv.Last().saved}"); } else { Console.WriteLine(lastChangeDate.Value.ToString("M/d/yyyy h:mm:ss tt")); } #endregion } } }
更简洁的LINQ写法
如果你偏好LINQ风格,可以用下面的代码实现同样的逻辑:
var sortedInv = inv.OrderByDescending(x => DateTime.Parse(x.saved)).ToList(); if (!sortedInv.Any()) return; var latestPrice = sortedInv.First().price; var firstDifferentRecord = sortedInv.Skip(1).FirstOrDefault(x => x.price != latestPrice); if (firstDifferentRecord != null) { var changeDate = sortedInv[sortedInv.IndexOf(firstDifferentRecord) - 1].saved; Console.WriteLine(changeDate); } else { Console.WriteLine($"商品{sortedInv.First().stock}价格从未变动过,最早记录日期:{sortedInv.Last().saved}"); }
运行结果
用你的示例数据测试,以上代码都会输出:8/7/2019 12:01:01 AM,完全符合你的期望。
内容的提问来源于stack exchange,提问作者DotNetFullStack
相关产品推荐
相关产品推荐

