Как связать объекты в C # - PullRequest
       10

Как связать объекты в C #

0 голосов
/ 28 сентября 2019

У меня есть 4 вопроса:

  1. Как это возможно, что я могу напечатать Console.WriteLine (list.head.Next.Next.Data).Из AddHead () новый объект будет сохранен поверх предыдущего объекта n.Next?

  2. Я создал пользовательский класс, чтобы попытаться понять, если в приведенном выше примере используется только список.Итак, как это возможно, что я могу Console.WriteLine (cc.head.Next.Next.Next.Data)?

  3. Как я могу разместить код в поле для форума,это мой первый пост, пожалуйста, прости меня.

Спасибо!

using System;

namespace GenericInterfaces
{
    class Program
    {
        static void Main()
        {
            //Declare and instantiate a new generic SortedList class.
            //Person is the type argument.
            SortedList<Person> list = new SortedList<Person>();

            //Create name and age values to initialize Person objects.
            string[] names = new string[]
            {
            "Franscoise",
            "Bill",
            "Li",
            "Sandra",
            "Gunnar",
            "Alok",
            "Hiroyuki",
            "Maria",
            "Alessandro",
            "Raul"
            };

            int[] ages = new int[] { 45, 19, 28, 23, 18, 9, 108, 72, 30, 35 };

            //Populate the list with new Node Objects
            for (int x = 0; x < 10; x++)
            {
                //ages[x] is integer
                list.AddHead(new Person(names[x],ages[x]));
            }

            //Print out unsorted list.
            foreach (var p in list)
            {
                System.Console.Write(p.ToString() + " ");
                Console.WriteLine("Unsorted Data");
                Console.WriteLine(list.head.Data);
                Console.WriteLine(list.head.Next.Data);
                Console.WriteLine(list.head.Next.Next.Data);
                Console.WriteLine(list.head.Next.Next.Next.Data);

            }
            System.Console.WriteLine("Done with unsorted list");


            Console.WriteLine("My Custom Class Experiment");
            MyCustomClass cc = new MyCustomClass();
            for (int i = 0; i < ages.Length; i++)
            {
                cc.AddHead(ages[i]);
            }
            Console.WriteLine("Added ages to custom class");
            Console.WriteLine(cc.head.Data);
            Console.WriteLine(cc.head.Next.Data);
            Console.WriteLine(cc.head.Next.Next.Data);
            Console.WriteLine(cc.head.Next.Next.Next.Data);
            Console.WriteLine(cc.head.Next.Next.Next.Next.Data);
            Console.WriteLine(cc.n.Data);
            Console.WriteLine(cc.n.Next.Data);

        }
    }
    //Type parameter T in angle brackets.
    public class GenericList<T> : System.Collections.Generic.IEnumerable<T>
    {
        public Node head;
        public Node current = null;

        // Nested class is also generic on T
        public class Node
        {
            public Node Next { get; set; } = null;
            public T Data { get; set; }

            public Node(T t)  //T used in non-generic constructor
            {
                Data = t;
            }
        }

        public GenericList()  //constructor
        {
            head = null;
        }

        public void AddHead(T t)  //T as method parameter type
        {
            Node n = new Node(t);
            n.Next = head;
            head = n;
        }

        // Implementation of the iterator
        public System.Collections.Generic.IEnumerator<T> GetEnumerator()
        {
            Node current = head;
            while (current != null)
            {
                yield return current.Data;
                current = current.Next;
            }
        }

        // IEnumerable<T> inherits from IEnumerable, therefore this class 
        // must implement both the generic and non-generic versions of 
        // GetEnumerator. In most cases, the non-generic method can 
        // simply call the generic method.
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
    public class MyCustomClass
    {
        public Mode head;
        public Mode current = null;
        public Mode n;

        // Nested class is also generic on T
        public class Mode
        {
            //public Mode Next { get; set; } = null;
            public Mode Next;
            public int Data { get; set; }

            public Mode(int t)  //T used in non-generic constructor
            {
                Data = t;
            }
        }

        public void AddHead(int t)  //T as method parameter type
        {
            n = new Mode(t);
            n.Next = head;
            head = n;
        }
    }

1 Ответ

1 голос
/ 28 сентября 2019

новый объект будет сохранен поверх предыдущего объекта n.Next?

В LinkedList свойство Next узла списка не сохраняет и не манипулирует чем-либо со списком,он просто возвращает следующий элемент, на который указывает узел.Возвращаемый элемент также является узлом, который имеет свой собственный элемент Next, который указывает на еще один элемент в списке.Если вы неоднократно звоните Next, вы просто путешествуете по списку

. Считайте, что это попытка найти вашего ребенка.Вы знаете, он пошел в дом Джона.Вы идете в дом Джона, но вам говорят «они пошли в дом Павла», поэтому вы идете в дом Пола и вам говорят «они пошли в дом Сары», поэтому вы идете в дом Сары ...

В каждомшаг, тебя отправляют в следующий дом, но ты никого не сносишь.Вы сохраняете память о том, где вы находитесь в списке домов.Если вы вернетесь в Johns House и начнете все сначала (заголовок списка), вы снова отправитесь по тому же маршруту

Если бы вы создали новую переменную, указывающую на заголовок списка, а затем неоднократно переназначали ее наЗатем вы всегда меняете узел, на который указывает ваша временная переменная, но сами узлы списка всегда также указывают друг на друга, и вы не нарушаете их отношения:

var tempNode = list.Node; //tempNode is you, you’re at john’s house now
tempNode = tempNode.Next; //now you’re at paul’s house
tempNode = tempNode.Next; //now you’re at sarah’s 

НетВремя вы мешали любому из существующих узлов.Что, если, когда вы добрались до дома Пола, вы сказали отцу Пола «если моя жена придет с просьбой, скажите ей, что мой сын пошел в дом Джейн» - это изменится, когда папа Пола укажет следующему человеку:tempNode = list.Node;// tempNode это вы, теперь вы в доме Джона tempNode = tempNode.Next;// теперь вы находитесь в доме Пола tempNode.Next = new Node («Дом Джейн»);

Теперь мы фактически манипулировали списком и изменили место, где Next следующего второго узла указывает на

как работает AddHead?

Он берет данные, которые вы передаете, и создает из них новый узел, затем устанавливает точку Next нового узла на существующий заголовок списка и делаетвместо этого существующий заголовок списка указывает на новый узел.Это эффективно заставляет список расти в обратном направлении, постоянно добавляя новую голову.Если вы хотите, чтобы дома посещались в порядке Джона, Пола и Сары, вам нужно было бы добавить их в порядке AddHead(Sarah), AddHead(Paul), AddHead(John)

Рост списка выглядит следующим образом:

head->nothing 

head->Sarah

head->Paul->Sarah

head->John->Paul->Sarah

Я упростил внешний вид этого, чтобы скрыть узлы и далее.Каждая стрелка -> обозначает Далее, каждое имя - это Данные внутри Узла

Как мне отправить код

Поставить 3 назад галочки на своей строке, до ипосле блока кода.Или префикс каждой строки в коде с 4 или более пробелами

как бы я назвал вопрос

Это действительно решать вам, так как это помогает нам понять, как выподумайте, как выглядит тело вопроса

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