Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Class B: A<B> - подправьте, пожалуйста / 14 сообщений из 14, страница 1 из 1
26.09.2016, 01:33
    #39315274
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
Сделал класс дерево с функцией обхода этого дерева.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public class CellTree
    {
        protected virtual List<CellTree> children;

        //Обход всего дерева
        protected void IterateCells()
        {
        }
    }



Хочется создать дочерний класс, чтобы у него было поле children и обход совершался именно по нему - как это сделать?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public class MDCell: CellTree
    {
        private override List<MDCell>  children;
        public List<MDCell>  Children
        {
            get { return children; }
        }
        public void Run()
        {
            IterateCells(...);
        }


Если я вызову функцию IterateCells, то IterateCells будет работать со своей коллекцией children.
как "переопределить" эту коллекцию? Вернее, как сделать так, чтобы поиск шёл именно по тем children, которые в MDCell ?
...
Рейтинг: 0 / 0
26.09.2016, 01:51
    #39315277
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
На данный момент решил задачу вот так (это сильно через ж.-у?)
Код: c#
1.
2.
3.
    public class CellTree<T> where T : CellTree<T>
    {
        protected List<T> children;


Код: c#
1.
public class MDCell: CellTree<MDCell>
...
Рейтинг: 0 / 0
26.09.2016, 07:22
    #39315296
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
Charles WeylandНа данный момент решил задачу вот так (это сильно через ж.-у?)

Пойдёт.
...
Рейтинг: 0 / 0
26.09.2016, 08:57
    #39315325
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
Charles Weyland,

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

Альтернативный способ
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
    public static class TreeHelper
    {
        public static IEnumerable<T> GetDepthFirstTree<T>(T root, Func<T, IEnumerable<T>> childrenSelector)
        {
            var stack = new Stack<T>();
            stack.Push(root);
            while (stack.Count > 0)
            {
                var item = stack.Pop();
                yield return item;
                
                var children = childrenSelector(item);
                if (children != null)
                    children.Reverse().Push(stack);
            }
        }

        public static IEnumerable<T> GetBreadthFirstTree<T>(T root, Func<T, IEnumerable<T>> childrenSelector)
        {
            var queue = new Queue<T>();
            queue.Enqueue(root);
            while (queue.Count > 0)
            {
                var item = queue.Dequeue();
                yield return item;

                var children = childrenSelector(item);
                if (children != null)
                    children.Enqueue(queue);
            }
        }        
    }

    public static class EnumerableHelper
    {        
        public static void Enqueue<T>(this IEnumerable<T> src, Queue<T> dest)
        {
            foreach (var item in src)
                dest.Enqueue(item);
        }

        public static void Push<T>(this IEnumerable<T> src, Stack<T> dest)
        {
            foreach (var item in src)
                dest.Push(item);
        }
    }

...
Рейтинг: 0 / 0
26.09.2016, 12:11
    #39315491
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
Да, идея отличная. Хороший код.

Но есть вопрос

Алексей К
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
        public static IEnumerable<T> GetDepthFirstTree<T>(T root, Func<T, IEnumerable<T>> childrenSelector)
        {
...
                var children = childrenSelector(item);
                if (children != null)
                    children.Reverse().Push(stack);
            }
        }


а разве не
Алексей К
Код: c#
1.
stack.Push(children);


?

и зачем там Reverse?
...
Рейтинг: 0 / 0
26.09.2016, 13:30
    #39315579
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
для иерархических структур, можно наследоваться сразу от списка бл* базового класса.

Код: c#
1.
2.
3.
4.
5.
6.
7.
public class TreeElement : List<TreeElement>
{
}

public class TreeElement : IList<TreeElement>
{
}
...
Рейтинг: 0 / 0
27.09.2016, 04:26
    #39315984
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
Charles WeylandДа, идея отличная. Хороший код.

Но есть вопрос

Алексей К
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
        public static IEnumerable<T> GetDepthFirstTree<T>(T root, Func<T, IEnumerable<T>> childrenSelector)
        {
...
                var children = childrenSelector(item);
                if (children != null)
                    children.Reverse().Push(stack);
            }
        }


а разве не
Алексей К
Код: c#
1.
stack.Push(children);


?

и зачем там Reverse?Там расширяющий метод для IEnumerable, в принципе пофиг, оформляй как самому больше нравится.

Reverse нужен для того, чтобы на выходе элементы были в порядке поступления, без него будут в обратном порядке.
...
Рейтинг: 0 / 0
27.09.2016, 05:55
    #39315985
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
Алексей КReverse нужен для того, чтобы на выходе элементы были в порядке поступления, без него будут в обратном порядке.

Queue?
...
Рейтинг: 0 / 0
27.09.2016, 05:58
    #39315987
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
hVosttАлексей КReverse нужен для того, чтобы на выходе элементы были в порядке поступления, без него будут в обратном порядке.

Queue?Нет.
...
Рейтинг: 0 / 0
27.09.2016, 10:32
    #39316070
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
Алексей К,Reverse нужен для того, чтобы на выходе элементы были в порядке поступления, без него будут в обратном порядке
Reverse возвращает void, поэтому метод расширения не вызывается.
А в целом, согласен. Спасибо за подход. Потёр свой код и воспользовался советом.
...
Рейтинг: 0 / 0
27.09.2016, 10:34
    #39316071
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
Алексей КhVosttпропущено...


Queue?Нет.

Queue FIFO же.

Алексей Кчтобы на выходе элементы были в порядке поступления
...
Рейтинг: 0 / 0
27.09.2016, 10:36
    #39316075
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
hVosttАлексей Кпропущено...
Нет.

Queue FIFO же.

Алексей Кчтобы на выходе элементы были в порядке поступленияОбход дерева в глубину делается через Stack.
...
Рейтинг: 0 / 0
27.09.2016, 10:46
    #39316084
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
Алексей КОбход дерева в глубину делается через Stack.

А, не заметил, это же не стек реверс, а для стека. Тогды норм )
...
Рейтинг: 0 / 0
27.09.2016, 11:25
    #39316116
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Class B: A<B> - подправьте, пожалуйста
hVostt,

OK :-)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Class B: A<B> - подправьте, пожалуйста / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]