【问题标题】:Search list of objects for maximum value by date按日期搜索最大值的对象列表
【发布时间】:2016-03-20 03:34:26
【问题描述】:

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

基本上我有一个由 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 循环正在使用的列表中选择美元金额的帮助,但我只希望它在每次迭代时从所述列表中选择按日期计算的最高金额。

我希望这是有道理的,我感谢您的帮助!

【问题讨论】:

  • 你需要一个 if else 块
  • 为什么不将item 传递给AnotherFunction 而不是自己指定所有值。另外您提供的代码由于缺少大括号而无法编译,请正确显示
  • 这是来自平面文件的数据,但我可能能够处理数据的导入。不错的主意,我会稍微尝试一下。

标签: c# linq foreach


【解决方案1】:

您可能希望按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 以及属于该日期的项目。通过对循环进行一些小的修改,您可以将其放入当前的结构中。

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

【讨论】:

  • 如果需要,请参阅我的答案,了解转换为 int 的逻辑
【解决方案2】:
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);
}

【讨论】:

  • 根据我和其他一些人的回答,ItemPrice 变量是一个字符串,因此可能需要转换为 int
  • 这个建议在我给定的情况下对我来说是最好的!非常感谢!
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

    您可以使用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));
      }
    

    【讨论】:

    • 这与我的回答类似,但请注意 ItemPrice 是字符串而不是 int,因此需要进行转换。
    • 你是对的,你就在几秒钟前 :-)
    • 我知道我不是在抱怨抄袭 :)
    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多