接受此用户的最高出价

本文关键字:高出价 用户 | 更新日期: 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个旧出价,会发生什么?它们都装了吗?