2016-12-22 1 views
0

В настоящее время я делаю проверку товара в корзине. Элемент может быть выкуплен несколько раз, но ограничен определенным числом. Каждый элемент имеет атрибут redeem_count, который хранит количество времени, которое может быть выкуплено. Итак, ниже приведена моя кодировка для проверки общего количества выкупленных предметов.Как сравнить объект в цикле foreach?

var previousCoupon = ""; 
var currentCoupon = ""; 
int count = 0; 
foreach (var p in cart.Promotions) 
{ 
    var query = db.wmp_mst_mcp_promo 
       .Where(a => a.wmp_mcp_promo_id == p.PromotionId) 
       .Where(a => a.wmp_redeem_count != null && a.wmp_redeem_count > 0) 
       .SingleOrDefault(); 

    if (query != null) 
    { 
     currentCoupon = query.wmp_mcp_promo_id; 

     if (previousCoupon == currentCoupon) 
      count++; 
     else 
      count = 0; 

     previousCoupon = currentCoupon; 

     if (count > query.wmp_redeem_count) 
      result.Invalidate(string.Format("You are not allowed to redeem more than {0} \"{1}\" voucher in 1 order", query.wmp_redeem_count, query.wmp_descriptions)); 

Как вы можете видеть, кодирование работает, но только в том случае, если тот же элемент выкуплен в порядке. Это может быть недействительным, так как не все клиенты будут выкупать товар в порядке. Ошибка возникает, если они выкупают, например, элемент A, затем элемент B, а затем элемент A снова. Она будет работать только если пункт А, пункт А, затем пункт B.

Отредактировано

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

Пример

товара в корзине

  • пункт А - 2 (redeem_count = 2) Действительно
  • пункт Б - 2 (redeem_count = 1) Недопустимый
  • пункт C - 3 (redeem_count = 4) Действительно

Так что отбросит result.Invalidate

Любая помощь? Благодарю.

+0

@wkl жаль. я обманул его. – Farid

+1

Я бы перебрал все рекламные акции, проверьте, находится ли идентификатор внутри HashSet. Если это увеличение redeem_count, если оно не добавляет этот идентификатор в HashSet. Это будет то, что вы хотите? – Mats391

+0

@ Mats391 Привет. На самом деле я хочу сравнить идентификатор каждого элемента, и если он совпадает с другим элементом, счетчик для этого объекта будет увеличиваться. Но только счет для этого предмета увеличивается. Пример, если элемент A встречается дважды, поэтому счетчик для элемента A становится 2, а если элемент B равен 3, счетчик для элемента B также становится 3. – Farid

ответ

0

Попробуйте это решение;

var previousCoupon = ""; 
     var currentCoupon = ""; 
     int count = 0; 
     foreach (var p in cart.Promotions) 
     { 
      var query = db.wmp_mst_mcp_promo 
       .Where(a => a.wmp_mcp_promo_id == p.PromotionId) 
       .Where(a => a.wmp_redeem_count != null && a.wmp_redeem_count > 0); 
if (query != null) 
{ 
     foreach(var queryItems in query) 
       { 
       currentCoupon = query.wmp_mcp_promo_id; 

       if (previousCoupon == currentCoupon) 
        count++; 
       else 
        count = 0; 

       previousCoupon = currentCoupon; 
      } 
} 
       if (count > query.wmp_redeem_count) 
        result.Invalidate(string.Format("You are not allowed to redeem more than {0} \"{1}\" voucher in 1 order", query.wmp_redeem_count, query.wmp_descriptions)); 
+0

Не работает здесь :( – Farid

+0

Я видел, что ур редактировал сейчас. Могу ли вы попробовать отлаживать и может ли сказать мне, что является результатом ur linq code, является то, что даёт u любое значение недействительным? код всегда дает действительный jus один результат – Ilaria

+0

Да, будет только один результат, как вы заявили. Я хочу, чтобы он проверял каждый элемент, если какой-либо из них выкуплен больше, чем его redeem_count. Я использовал foreach loop для этого, но он работает только как я упоминал выше, где один и тот же элемент должен быть рядом друг с другом. – Farid

2

Я хотел бы сделать что-то вроде (псевдокод):

var dict = new Dictionary<string /*item_Id*/, int /*count*/>; 
// count redemptions for each id 
foreach(var item in cart) 
{ 
    if(dict.ContainsKey(item.Id)) 
     dict[item.Id]++; 
    else 
     dict.Add(item.Id, 1); 
} 

// check if any of them violate the allowed maximum 
foreach(var itemId in dict.Keys) 
{ 
    if(dict[itemId ] > GetMaxRedeemCount(itemId)) 
    { 
     result.Invalidate(...); 
     // you may want to break here... 
     // break; 
    } 
} 
+0

Не удалось сравнить «count», чтобы вычитать счет в первом цикле после добавления. Избавьтесь от второго цикла – Mats391

+0

@ Mats391 Да, это удалит второй цикл, но он будет выполнять еще больше сравнений и вызывает «GetMaxRedeemCount» (по одному для каждого элемента вместо одного для item_id).Поэтому я не вижу преимущества w.r.t. представление. Что касается читаемости, лично я бы предпочел два цикла (и, возможно, даже преобразовать каждый из них в отдельный метод). – wkl