按日期搜索对象列表中的最大值

本文关键字:最大值 列表 对象 日期 搜索 | 更新日期: 2023-09-27 18:26:47

我希望我能很好地解释我的情况以获得一些帮助。

基本上,我有一个由ItemRows组成的列表(ItemList),如下

ItemRows
        public string ItemId { get; set; }
        public string ItemDate { get; set; }
        public string ItemPrice { get; set; }

目前,我处于foreach循环中,该循环在每次迭代中将当前变量传递给另一个函数。然而,当我通过价格时,我只想通过每个ItemDate的最高价格。

foreach item in ItemList
{
    AnotherFunction(ItemId, ItemDate, MaxPriceByDate);
}

因此,如果我有以下4行数据。。。。

123, 01/01/2015, $15
234, 01/01/2015, $20
345, 01/02/2015, $10
456, 01/02/2015, $5

以下是我希望循环传递信息的方式:

first iteration:  123, 01/01/2015, $20
second iteration: 234, 01/01/2015, $20
third iteration:  345, 01/02/2015, $10
fourth iteration: 456, 01/02/2015, $10

基本上,我正在寻找如何从foreach循环正在使用的列表中选择美元金额的帮助,但我只希望它每次迭代都能从所述列表中按日期选择最高金额。

我希望这是有意义的,我感谢你的帮助!!

按日期搜索对象列表中的最大值

您可能希望按ItemDate属性进行分组,并以不同的方式处理它。例如

 var grouped = (from r in rows
                 group r by r.ItemDate into g
                 select new { Date = g.Key, MaxPrice = g.Max(gg=>gg.ItemPrice)
                 Items = g})

这将为您提供一个结构,其中每个元素都有一个日期、该日期的MaxPrice以及属于该日期的项目。通过在循环中进行一些小的修改,您可以将其放入当前的结构中。

编辑:正如另一个答案中所指出的,如果价格是字符串或与日期属性相同,您可能必须将其转换为某种数字格式。我建议在进入这个逻辑之前先将字符串转换为日期和数字。

foreach(var item in ItemList)
{
    AnotherFunction(item.ItemId, item.ItemDate, ItemList.Where(x => x.ItemDate == item.ItemDate)
                                                        .OrderByDesc(z => Convert.ToInt32(z.ItemPrice.Replace("$", "")))
                                                                                 .First().ItemPrice);
}

如果你想要的只是MaxPricePerDate,你可以使用以下linq函数:

int nMaxPrice = ItemList.Where(i => i.ItemDate == item.ItemDate
                        .Max(i => Convert.ToInt32(i.ItemPrice));

此外,如果字符串确实包含$符号,则需要像i.ItemPrice.Replace("$", ""); 一样首先将其剥离

需要Convert调用来将字符串转换为int,但是这很危险,因为如果字符串的格式不正确,则可能引发异常。还可以考虑研究Int32.TryParse();

您可以使用Linq来查找当前数据的最大价格。这可能不是最有效的方法,但它会起作用:

  foreach(var item in itemList)
  {
        Console.WriteLine("{0} {1} {2}", item.ItemId, item.ItemDate, itemList.Where(i => i.ItemDate == item.ItemDate).Max(d => d.ItemPrice));
  }