Я создаю сайт аукциона, и пользователь может делать ставки на один и тот же товар более одного раза (очевидно).На панели пользователя, пользователь может просматривать свои ставки.Когда пользователь делает ставку на один и тот же товар более одного раза, я хочу, чтобы отображалась только одна запись с наибольшим значением ставки.Мой текущий код показывает запись для каждой ставки.Я попробовал несколько вещей, но я не мог понять это.Вот что у меня есть:
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;
}
Я пытался получить отличные ставки на основе Item.Id, но это не сработало.Теперь я думаю, может быть, я мог бы как-то использовать свойство Date сущности Bid, чтобы получить желаемый результат, но моя голова перестала думать.
Есть предложения?
ОБНОВЛЕНИЕ:
Я заставил его работать, используя словарь и используя 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);
}
}
}
Как мне избавиться от этих петель?А может быть, все это в одном утверждении?