Возьмите самую высокую ставку от этого пользователя - PullRequest
0 голосов
/ 11 июня 2011

Я создаю сайт аукциона, и пользователь может делать ставки на один и тот же товар более одного раза (очевидно).На панели пользователя, пользователь может просматривать свои ставки.Когда пользователь делает ставку на один и тот же товар более одного раза, я хочу, чтобы отображалась только одна запись с наибольшим значением ставки.Мой текущий код показывает запись для каждой ставки.Я попробовал несколько вещей, но я не мог понять это.Вот что у меня есть:

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);
            }
        }
    }

Как мне избавиться от этих петель?А может быть, все это в одном утверждении?

Ответы [ 2 ]

3 голосов
/ 11 июня 2011

Комментарии, опубликованные до сих пор, должны быть хорошим признаком того, что вам следует немного подумать о ре-архитектуре, но непосредственное кодовое решение предполагает использование System.Linq для объединения вместе GroupBy, Max и Select.

1 голос
/ 11 июня 2011

Вы можете просто создать словарь пользовательских ставок, где ключом является идентификатор товара.Затем для каждой пользовательской ставки, если идентификатор товара еще не используется, добавьте текущую ставку в словарь, если она используется, то посмотрите, не превышает ли сумма ставки предмета, существующего в словаре, текущий предмет, и заменитесуществующий элемент в словаре с текущим.

Однако это очень неэффективно, так как на самом деле вы хотите загружать только первые 1 отсортированные ставки по убыванию по ставке для каждого идентификатора ставки, а не загружать все ставки, а затем работатьсамый высокий.Что произойдет, если у вашего пользователя 10000 старых ставок?Они все загружены?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...