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