Функция находится в бесконечном цикле, но должна быть заблокирована циклами foreach

#c#

Вопрос:

Я уже давно получил эту ошибку: цель этих двух функций-объединить все возможные элементы, имеющие одинаковые атрибуты, и проверить, какой из них самый дешевый.

Например: У вас есть массив атрибутов и вы проверяете один товар, он не соответствует требованиям, поэтому он повторяет цикл для каждого отдельного товара, кроме этого, поэтому теоретически список продуктов аукциона должен прекратиться, как только будет достигнут каждый возможный результат.

В моей программе он продолжает зацикливаться, и количество аукционных товаров в параметрах остается на уровне 39, уменьшается только на 1 и снова увеличивается на единицу. Может ли кто-нибудь помочь мне в этом, я знаю, что это не связано с какими-либо исключениями или ошибками.

Редактировать: Я выяснил, что количество аукционных товаров(39), которые постоянно пересматриваются, — это количество продуктов, к которым предъявляются требования.

Вот основная функция:

 public static decimal AttributesPrice(this Dictionary<string, dynamic> attributes, List<AuctionProduct> auctionProducts, decimal basePrice, params string[] attributeNames)  //How does the loop keep going when it should be limited (auctionProducts*auctionProducts-1*auctionProducts-2*auctionProducts-3*auctionProducts-4)
       {
           var prices = new List<decimal>();

           foreach (var auctionProduct in auctionProducts)
           {
               if (attributes.HasValues(auctionProduct.Items.Entries[0].Tag.Attributes, attributeNames))
               {
                   prices.Add(auctionProduct.Info.StartingBid - basePrice);
               }
               else
               {
                   prices.Add(attributes.Subtract(auctionProduct.Items.Entries[0].Tag.Attributes).MergeAttributes(auctionProduct, auctionProducts.Reranged(auctionProduct), basePrice, attributeNames));
               }
           }

           Console.WriteLine(auctionProducts.Count());
Output:
39
37
37
39
37
37
39
41
37
37
39
37
37
39
Keeps going on for infinite
           if (prices.Count() > 0)
               return prices.Min();

           return 0;
       }
 

Вот моя функция для объединения атрибутов:

        private static decimal MergeAttributes(this Dictionary<string, dynamic> attributes, AuctionProduct auctionProduct, List<AuctionProduct> auctionProducts, decimal basePrice, string[] attributeNames)
       {
           var prices = new List<decimal>();

           foreach (var auctionComparer in auctionProducts)
           {
               if (attributes.HasValues(auctionComparer.Items.Entries[0].Tag.Attributes, attributeNames))
               {
                   prices.Add(auctionComparer.Info.StartingBid   auctionProduct.Info.StartingBid - basePrice * 2);
               }
               else
               {
                   prices.Add(attributes.AttributesPrice
                             (auctionProducts.Reranged(auctionComparer), basePrice, attributeNames) -
                              basePrice);
               }
           }

           if (prices.Count() > 0)
               return prices.Min();

           return 0;
       }
 

Вот моя функция изменена(это не проблема, у меня было это до того, как я добавил это):

 public static List<AuctionProduct> Reranged(this List<AuctionProduct> list, params AuctionProduct[] items)
       {
           var buffer = new List<AuctionProduct>(list);
           foreach (var item in items)
               buffer.Remove(item);

           return buffer;
       }   
 

Вот моя функция(она вычитает все значения, которые не видны в словаре, и работает по назначению)

 public static Dictionary<string, dynamic> Subtract(this Dictionary<string, dynamic> dictionary, Dictionary<string, dynamic> subtractor )
        {
            dynamic compareOut;
            if (ValueComparing.Compare(subtractor, dictionary, out compareOut)) return null;
            else return (Dictionary<string, dynamic>)compareOut;
        }
 

Вот моя функция для проверки значения(работает по назначению)

         public static bool HasValues(this Dictionary<string, dynamic> attributes, Dictionary<string, dynamic> comparer,string[] attributeNames)
        {
            foreach (var attribute in attributes)
            {
                if (!attributeNames.Contains(attribute.Key))
                {
                    if (!comparer.ContainsKey(attribute.Key))
                    {
                        return false;
                    }
                    else if (!ValueComparing.Compare(comparer[attribute.Key], attribute.Value))
                    {
                        return false;
                    }
                }
            }
            return true;
        }
 

Комментарии:

1. Вы прошли через отладчик? Вы писали модульные тесты для правильного поведения?

2. Да, я трачу много времени на отладку. Я ничего не могу найти, и это почти вся информация, которую я могу дать.

3. Ваши AttributePrices звонки MergeAttributes и наоборот MergeAttributes звонки AttributePrices . Мы не можем проверить условия, при которых это происходит, потому что ваш код далек от завершения и вы не опубликовали никаких примеров данных. Но есть вероятность, что эти двое будут звонить друг другу бесконечно при определенных условиях …

4. Где остальная часть функции AttributePrices?