我希望我能够很好地解释我的情况以获得一些帮助。
基本上我有一个由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循环使用的美元金额的帮助,但我只希望它每次迭代从所述列表中选择最高金额。
我希望这是有道理的,谢谢你们的帮助!!
答案 0 :(得分:4)
您可能希望按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})
这将为您提供一个结构,其中每个元素都有该日期的Date,MaxPrice以及属于该日期的项目。通过循环中的一些小修改,您可以将其适合您当前的结构。
编辑:如另一个答案中所述,如果它与字符串相同或与date属性相同,则可能必须将价格转换为某种数字格式。在进入这个逻辑之前,我建议将字符串转换为日期和数字。
答案 1 :(得分:3)
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);
}
答案 2 :(得分:3)
如果您要求的是MaxPricePerDate
,您可以使用以下linq函数:
int nMaxPrice = ItemList.Where(i => i.ItemDate == item.ItemDate
.Max(i => Convert.ToInt32(i.ItemPrice));
此外,如果字符串确实包含$
符号,则需要首先将其删除,如i.ItemPrice.Replace("$", "");
将字符串转换为int需要Convert
调用,但是如果字符串格式不正确则可能会引发异常,这是危险的。还要考虑查看Int32.TryParse();
答案 3 :(得分:0)
您可以使用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));
}