예제 #1
0
        private static List <FractionLong> GetNonZeroBasketFractionValues(BasketCombination <FractionLong> basketCombination)
        {
            var basketFractionValues = basketCombination.Baskets.Select(x => x.BasketElements.Aggregate(0.FL(), (res, n) => res + n)).ToList();
            var nonzeroBasketsValues = basketFractionValues.Where(x => x != 0.FL()).ToList();

            return(nonzeroBasketsValues);
        }
예제 #2
0
        private static bool BasketCombinationMatches(List <FractionLong> fields, BasketCombination <FractionLong> basketCombination)
        {
            var nonzeroBasketsValues = GetNonZeroBasketFractionValues(basketCombination);

            var remaningFields = new List <FractionLong>(fields);

            var matchFound = true;

            foreach (var basketValue in nonzeroBasketsValues)
            {
                if (ThereIsMatchingFieldIn(remaningFields, basketValue))
                {
                    RemoveMatchingFieldFrom(remaningFields, basketValue);
                }
                else
                {
                    matchFound = false;
                    break;
                }
            }

            var thereAreNoFractionFieldsRemaining = remaningFields.Where(x => x.HasFractionPart).Count() == 0;

            return(matchFound && thereAreNoFractionFieldsRemaining);
        }
예제 #3
0
        /// <summary>
        /// Получает все варианты раскладки элементов по корзинам. (Например, массив {1, 2, 3} по двум
        /// корзинам можно разложить так: первая корзина {1, 2}, вторая корзина {3}. При передаче в метод
        /// одинаковых объектов, комбинации, получающиеся их перестановкой выдаваться не будут.
        /// </summary>
        /// <typeparam name="T">Тип передаваемых объектов</typeparam>
        /// <param name="elements">Элементы для раскладки по корзинам</param>
        /// <param name="numberOfBaskets">Число корзин, по которым раскладываем</param>
        /// <returns></returns>
        public List <BasketCombination <T> > GetCombinationsInBaskets <T>(List <T> elements, int numberOfBaskets)
        {
            #region Assertions
            Check.That(numberOfBaskets >= 0, "Минимальное число корзин - ноль.");
            #endregion

            if (numberOfBaskets == 0)
            {
                return(new List <BasketCombination <T> >());
            }

            if (numberOfBaskets == 1)
            {
                var basket            = new Basket <T>(elements);
                var basketCombination = new BasketCombination <T>(new List <Basket <T> > {
                    basket
                });
                return(new List <BasketCombination <T> > {
                    basketCombination
                });
            }


            var result = new List <BasketCombination <T> >();

            var combinations = GetCombinations(elements);
            foreach (var combination in combinations)
            {
                var remainingElements = GetRemainingObjects(elements, combination.Elements);
                var innerCombinations = GetCombinationsInBaskets(remainingElements, numberOfBaskets - 1);

                foreach (var innerCombination in innerCombinations)
                {
                    var currentBasket    = new Basket <T>(combination.Elements);
                    var otherBaskets     = innerCombination.Baskets;
                    var resultBasketList = new List <Basket <T> >();
                    resultBasketList.Add(currentBasket);
                    resultBasketList.AddRange(otherBaskets);
                    var basketCombination = new BasketCombination <T>(resultBasketList);
                    result.Add(basketCombination);
                }
            }

            return(result);
        }