接受此用户的最高出价
本文关键字:高出价 用户 | 更新日期: 2023-09-27 17:58:51
我正在建立一个拍卖网站,用户可以多次对同一物品出价(显然)。在用户的仪表板中,用户可以查看他的出价。当用户对同一项目多次出价时,我只希望出现一个出价值最高的条目。我当前的代码显示每个出价的条目。我试了几件事,但都想不通。这是我得到的:
public class Bid
{
public int Id { get; set; }
public double Amount { get; set; }
public DateTime Date { get; set; }
public virtual Item Item { get; set; }
public virtual User User { get; set; }
}
protected override List<ItemForUserBids> ResolveCore(User source)
{
var items = new List<ItemForUserBids>();
var userBids = source.Bids;
foreach (var bid in userBids)
{
var item = bid.Item;
var c = new ItemForUserBids
{
BidValue = bid.Amount,
BidId = bid.Id,
Description = item.Description,
Id = item.Id,
ItemThumb = item.MainImageLink(),
Status = _itemsService.GetBiddingStatus(item, source),
TimeLeft = item.EndDate.TimeLeft(),
Title = item.Title
};
items.Add(c);
}
return items;
}
我试图获得基于该项目的独特出价。我知道,但那没用。现在我在想,也许我可以以某种方式使用投标实体的Date属性来获得我想要的结果,但我的大脑停止了思考。
有什么建议吗?
更新:
我使用了一本字典,并像许多人建议的那样使用了OrderBy()和Max()。但我认为后者可以进一步改进。
使用字典实现(有效):
var userBids = new Dictionary<string, Bid>();
foreach (var bid in allUserBids)
{
var key = bid.Item.Id.ToString();
if(userBids.ContainsKey(key))
{
if (userBids[key].Amount < bid.Amount)
userBids[key] = bid;
}
userBids[key] = bid;
}
尝试使用其他方法(有效):
var highestBids =
source.Bids.Where(x => x.Date > DateTime.Now.AddYears(-1))
.GroupBy(x => x.Item.Id,
(itemId, bids) =>
new
{
ItemId = itemId,
MaxBid = bids.Max(x => x.Amount)
}).ToList();
var userBids = new List<Bid>();
foreach (var bid in source.Bids)
{
for(var i = 0; i < highestBids.Count; i++)
{
var curr = highestBids[i];
if (bid.Item.Id.Equals(curr.ItemId) && bid.Amount.Equals(curr.MaxBid)) {
userBids.Add(bid);
highestBids.Remove(curr);
}
}
}
我该如何摆脱这些循环?也许这一切都在一个连锁的声明中?
到目前为止发布的评论应该是一个很好的指示,表明您应该考虑重新构建它,但直接的代码解决方案涉及使用System。Linq将GroupBy、Max和Select链接在一起。
您可以简单地创建一个用户出价的字典,其中键是物品id。然后,对于每个用户出价,如果物品id尚未使用,则将当前出价添加到字典中,如果已使用,则查看字典中存在的物品的出价金额是否低于当前物品,然后将字典中现有的物品替换为当前物品。
然而,这是非常低效的,因为实际上你只想加载按每个出价id的出价金额降序排列的前1个出价,而不是加载所有出价,然后计算出最高出价。如果你的用户有10000个旧出价,会发生什么?它们都装了吗?