Нужна рекурсивная функция для решения типичной проблемы вариации электронной торговли - PullRequest
0 голосов
/ 06 июля 2011

Допустим, у меня есть следующие данные (в псевдокоде для удобства чтения):

var myVariations = [
    { Name = "Color", Values = ["Red", "Yellow", "Green" /*, etc. */] },
    { Name = "Size", Values = ["S", "M", "L" /*, etc. */] },
    { Name = "Length", Values = ["34", "35", "36" /*, etc. */] },
    /* and so on...(up to 5 total) */
];

И я могу получить эти данные с помощью LINQ следующим образом:

var myVariations = myProduct.Variations.ToList();

Как я могу сопоставить эти варианты с такой структурой (для eBay Trading API):

var ebayVariations = [
    {
        Name = "Red-S-34",
        Value = [
                                       // yes, these are arrays with only one item
            { Name = "Color", Values = [{Value = "Red"}] },
            { Name = "Size", Values = [{Value = "S"}] },
            { Name = "Length", Values = [{Value = "34" }] }
        ]
    },
    /* etc for all possible combinations */
];

Очевидно, что тот факт, что массив Values содержит только одно значение, немного странен; но с торговым API eBay, если я перечисляю несколько значений в одной вариации (что легко сделать по сравнению с этим рекурсивным материалом), он жалуется. Итак, в качестве альтернативы, если вы знакомы с eBay Trading API, как я могу заставить его работать «оптимальным» образом, в соответствии с тем, как eBay намеревался отображать варианты (вызывается через AddFixedPricedItem если вы заботитесь).

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Я незначительно изменил терминологию, но написал уточняющие комментарии.

    public IEnumerable<Combination> GetCombinations(Variation[] variations, int variationIndex, IEnumerable<VariationPosition> aggregatedPositions)
    {
        // We should choose one position from every variation, 
        // so we couldn't produce combination till we reach end of array. 
        if (variationIndex < variations.Length)
        {
            // Pick current variation.  
            var currentVariation = variations[variationIndex];

            // Every variation has list of possible positions (Color could be Green, Redm, Blue, etc.).
            // So we should walk through all the positions 
            foreach (var val in currentVariation.Positions)
            {
                // Current position. Variation's name will be used during creating result Combination.
                var position = new VariationPosition()
                {
                    Name = currentVariation.Name,
                    Value = val
                };
                // Add position to already aggregated on upper levels of recursion positions.
                var newPositions = aggregatedPositions.Concat(Enumerable.Repeat(position, 1));

                // So we picked some variation position 
                // Let's go deeper.
                var combinations = this.GetCombinations(variations, variationIndex + 1, newPositions );

                // This piece of code allows us return combinations in iterator fashion.
                foreach (var combination in combinations)
                {
                    yield return combination;
                }
            }
        }
        else
        {
            // We reached end of variations array 
            // I mean we have one position of every variation. 

            // We concatenate name of positions in order to create string like "Red-S-34"
            var name = aggregatedPositions.Aggregate("", (res, v) => res += v.Name);

            // This code is a little bit naive, I'm too lazy to create proper infrastructure,
            // But its mission is to create content for property Value of your ebayVariations item. 
            var value = aggregatedPositions
                .Select(v => new { Name = v.Name, Values = new[] { new { Value = v.Value } } })
                .ToArray();

            // And we return completed combination.
            yield return new Combination()
            {
                Name = name,
                Value = value,
            };
        }
    }

И использование:

var allCombinations = this.GetCombinations(inputVariations, 0, new VariationPosition[0]).ToArray();
1 голос
/ 06 июля 2011

Я ничего не знаю об eBay Trading API, но вот статья о вычислении декартового продукта с помощью LINQ (самый последний шаг отбрасывает рекурсию в пользу агрегирования).

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