C # - Дерево / Рекурсия в Get и Set Accessors? - PullRequest
2 голосов
/ 23 февраля 2011

У меня есть дерево (a List<T>), которое содержит количество ItemType классов (см. Код ниже);класс имеет свойства OverrideDiscount (которые могут быть null, что указывает на использование DefaultDiscount (которые могут быть null, что указывает на использование parent ItemType 's CalculatedDiscount))

Итак, вы видите, что мне нужно набрать дерево (которое, кстати, List<ItemType>), чтобы получить CalculatedDiscount родителя, потому что это может быть null, что означает, что вам нужно получить родительродительский CalculatedDiscount и так далее ...

Неужели плохая идея поместить код для этого в аксессор Get?

Как бы вы справились с этим?

Так же, как sidenote, все эти данные поступают через SqlDataReader из базы данных в произвольном порядке, после чего список свойств Childrenзаполняется циклом по дереву и добавляется в список Children в зависимости от ситуации.Таким образом, родители не знают о детях до тех пор, пока не будет вызван метод доступа Set, исключая возможность добавления чего-либо полезного в метод доступа Set (например, установка всех детей CalculatedDiscount в метод доступа Set).Если только я не пропустил какой-то другой способ сделать это (очень возможно, рекурсия иногда жарит мой мозг).

Заранее спасибо

Класс пока:

    public class ItemType
    {
        public int ID;
        public int? ParentID;
        public List<ItemType> Children;

        public double? DefaultDiscount; 
        public double? OverrideDiscount; 
        public double CalculatedDiscount
        {
            get
            {
                if (OverrideDiscount != null)
                {
                    return (double)OverrideDiscount; //+ Autospec qty
                }
                else
                {
                    if (DefaultDiscount != null)
                    {
                        return (double)DefaultDiscount;
                    }
                    else
                    {

                        //I need to get this ItemType's parent's discount 
                        //here by recursing up the tree...is this a bad idea?
                    }
                }
            }
        }
    }

Ответы [ 3 ]

4 голосов
/ 23 февраля 2011

Вместо того, чтобы просто хранить Id родительского элемента, я бы сохранил весь объект.Это сделало бы это намного проще (я бы также преобразовал эти публичные переменные в свойства):

public class ItemType
{
    public int Id { get; set; }
    public ItemType Parent { get; set; }
    public List<ItemType> Children; { get; set; }

    public double? DefaultDiscount { get; set; }
    public double? OverridenDiscount { get; set; }

    public double CalculatedDiscount
    {
        get
        {
            return (double)(OverridenDiscount ?? 
                            DefaultDiscount ?? 
                            (Parent != null ? Parent.CalculatedDiscount : 0));
        }
    }
}
1 голос
/ 23 февраля 2011

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

0 голосов
/ 23 февраля 2011

Свойства обычно считаются не очень полезными.Поэтому я предлагаю создать метод GetCalculatedDiscount, который выполняет все обходы.

...