none
Изменение свзанного списка в C# RRS feed

  • Вопрос

  • Доброго всем времени суток, вновь осмелюсь побеспокоить вас. Вопрос такой: как разделить каждый элемент списка на максимальное значение в этом списке? Всё что мне удалось найти самостоятельно - это .Aggregate(); но этот метод аккумулирует сумму результатов операции, а мне нужно каждое значение списка разделить на максимальное значение этого списка.

    Как то так (это схематичное изображение того что мне нужно, я не знаю как получить доступ к отдельным элементам списка):

    vectorList[i] = vectorList[i]/max;

     

    Да, и сразу второй вопрос: как получить доступ к определённому элементу списка? К примеру если нужно вывести только пятый элемент на консоль, то какой код для этого потребуется?

     

    Ну и собственно сам код того, что мне удалось сделать:

     

    using System;
    using System.Linq;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Lab07_1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Введите элементы вектора, разделяя их пробелом: ");
                string inputString = Console.ReadLine();
                string[] arrayString = inputString.Split(' ');
                double[] dArray = new double[arrayString.Length];
    
                for (int i = 0; i < arrayString.Length; i++)
                    dArray[i] = Convert.ToDouble(arrayString[i]);
    
    
                LinkedList<double> vectorList = new LinkedList<double>(dArray);
                double max = vectorList.Max();
    
                Console.ReadLine();
            }
        }
    }
    
    

     


    MSDN AA User
    25 октября 2011 г. 6:29

Ответы

  • > нужно вставить строчку, помещающую значение элемента temp обратно в значение vectorList c индексом 5. Как это можно сделать?
     
    примерно так 
    var lst = new LinkedList<double>("3 2 1".Split(' ').Select(str => Double.Parse(str)));
    var n = GetNode(lst, 2);
    n.Value = 123;
    foreach(var v in lst)
        System.Diagnostics.Trace.WriteLine(v);
    
    ...
    LinkedListNode<T> GetNode<T>(LinkedList<T> list, int index)
    {
        var cur = list.First;
        var ei = 0;
        while(cur != null)
        {
            if(ei++ == index)
                return cur;
            cur = cur.Next;
        }
        return null;
    }
    

    • Предложено в качестве ответа Abolmasov Dmitry 25 октября 2011 г. 16:53
    • Отменено предложение в качестве ответа asdfxcbneftyherwe 25 октября 2011 г. 17:05
    • Помечено в качестве ответа asdfxcbneftyherwe 25 октября 2011 г. 17:06
    25 октября 2011 г. 16:51
  • > Я понимаю что поле val указывает на начало следующего члена списка, но не понимаю как с этим работать.


     | prev
     ___
    |___| 
         |  next

     | prev
     ___
    |___| 
        |   next

    это двусвязный список; prev - это ссылка на предыдущий элемент, next - на следующий.
    у односвязных списков у элементов есть только prev или только next
    пример двусвязного списка:

    class Node
    {
        public Node Next;
        public Node Prev;
        public object Data;
    }
    ...
    var n1 = new Node { Data = 1 };
    var n2 = new Node { Data = 2, Prev = n1 };
    n1.Next = n2;
    var n3 = new Node { Data = 3, Prev = n2 };
    n2.Next = n3;






    • Помечено в качестве ответа asdfxcbneftyherwe 29 октября 2011 г. 21:32
    29 октября 2011 г. 21:30
  • > vectorList[] MyVector = new vectorList[VectorElements.Length];


    создавать массив из узлов одно/двусвязного списка не нужно.
    массив - это как коробка. в которую кладут элементы одинакового размера. зная ширину элемента - легко найти n-ный. это плюс. а минус в том, что если надо добавить элемент(ы), то надо взять коробку большего размера и перенести элементы из одной коробки в другую коробку.
    возможна ситуация, когда в шкафу/памяти не будет места для коробки. но останется много мест меньшего размера.
    поэтому придумали связные списки. когда каждый элемент сам себе коробка, в которой хранится также ссылка на другой элемент (следующий и/или предыдущий). редактировать связный список легко, надо только изменить ссылки у элементов.
    но чтобы найти n-ный элемент надо ходить по ссылкам и отсчитывать сколько элементов прошли.
    чтобы при добавлении элемента в конец списка, каждый раз не искать хвост, создают объект, который хранит ссылку на последний элемент. 

     

    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                var lst = new List<int>();
                lst.Add(1);
                lst.Add(2);
                lst.Add(3);
                foreach (var itm in lst.Nodes())
                    System.Diagnostics.Trace.WriteLine(itm.Data);
    
                var v1 = lst.Node(0);  // 1
                var v2 = lst.Node(5);  // null
                var v3 = lst.Node(2);  // 3
            }
        }
    
        class List<T>
        {
            public Node<T> Head { get; private set; }
            Node<T> Last;
            public void Add(T data)
            {
                var n = new Node<T> { Data = data };
                if (Last == null)
                    Head = Last = n;
                else
                {
                    Last.Next = n;
                    n.Prev = Last;
                    Last = n;
                }
            }
            public IEnumerable<Node<T>> Nodes()
            {
                var cur = Head;
                while (cur != null)
                {
                    yield return cur;
                    cur = cur.Next;
                }
            }
            public Node<T> Node(int index)
            {
                int cur = 0;
                foreach (var itm in Nodes())
                    if (cur++ == index)
                        return itm;
                return null;
            }
        }
        class Node<T>
        {
            public Node<T> Next;
            public Node<T> Prev;
            public T Data;
        }
    }
    

     


    • Изменено Malobukv 30 октября 2011 г. 18:51
    • Помечено в качестве ответа asdfxcbneftyherwe 30 октября 2011 г. 19:31
    30 октября 2011 г. 18:49

Все ответы

  • > как разделить каждый элемент списка на максимальное значение в этом списке?
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    ...
    var arr = "12.0 34.3 78 2.98 1 3".Split(' ').Select(str => Double.Parse(str));
    var ss = new SortedSet<double>(arr);
    foreach(var v in arr)
        System.Diagnostics.Trace.WriteLine(v + " " + (v/ss.Max));
    



    • Помечено в качестве ответа asdfxcbneftyherwe 25 октября 2011 г. 17:05
    • Снята пометка об ответе Abolmasov Dmitry 25 октября 2011 г. 19:40
    25 октября 2011 г. 6:57
  • > как получить доступ к отдельным элементам [связанного] списка

     

    var ll = new LinkedList<double>(arr);
    var itm = ll.ElementAt(2);    //= 78
    

     

    • Помечено в качестве ответа asdfxcbneftyherwe 25 октября 2011 г. 17:05
    • Снята пометка об ответе Abolmasov Dmitry 25 октября 2011 г. 19:40
    25 октября 2011 г. 7:03
  • Почему вы выбрали именно LinkedList? Если вам нужен доступ к элементу по индексу, то лучше использовать просто List, иначе вы теряете производительность.

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


    Для связи [mail]
    25 октября 2011 г. 7:36
  • Задание выглядит так:

    Разработать программу нормализации элементов вектора (все элементы вектора делятся на максимальное значение в нём). Элементы вектора вводятся с клавиатуры и хранятся в связанном списке.

    Как понимаю связанный список - это LinkedList, но я не понимаю между ними разницы. :-)

    И вот ещё вопрос по делению на максимальное значение: в Вашем коде я увидел, что фактически значение v/ss.Max записывается сразу в выходной поток. А можно ли это значение сохранить обратно в этот же список?

     


    MSDN AA User
    25 октября 2011 г. 14:39
  • Если так, то и связный список нужно реализовать вам, а не взять готовую реализацию ;)

    Сохранять максимальный элемент можно при вводе данных в какую-нибудь переменную.

    25 октября 2011 г. 14:47
    Отвечающий
  • >Если так, то и связный список нужно реализовать вам, а не взять готовую реализацию ;)

    Нет, не слышал :)

    ПС: как можно такое разработать? Я даже не совсем понимаю что это такое :) Так что будем пользоваться тем, что есть ^^

    ППС: задание для С++ изначально было.


    MSDN AA User
    25 октября 2011 г. 15:12
  • И вот сразу последний вопрос: как изменить значение элемента списка, находящегося по определённому адресу?

     

    Например:

    double temp = vectorList.ElementAt(5);

    temp /= maxValueInVectorList;

    //и вот тут нужно вставить строчку, помещающую значение элемента temp обратно в значение vectorList c индексом 5. Как это можно сделать?


    MSDN AA User
    25 октября 2011 г. 15:41
  • Знакомство со связным списком можно начать со статьи на википедии - Связный список, хотя бы просто для того, чтобы вы понимали что это такое.

    На c# вы можете реализовать подобие этого, используя классы.

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


    Для связи [mail]
    25 октября 2011 г. 15:43
  • Дмитрий, спасибо. Весьма интересная статья. Вечером попробую создать список. А сейчас подскажите пожалуйста, как изменить значение элемента списка, находящегося по определённому адресу? ^_^

     


    MSDN AA User
    25 октября 2011 г. 16:02
  • > нужно вставить строчку, помещающую значение элемента temp обратно в значение vectorList c индексом 5. Как это можно сделать?
     
    примерно так 
    var lst = new LinkedList<double>("3 2 1".Split(' ').Select(str => Double.Parse(str)));
    var n = GetNode(lst, 2);
    n.Value = 123;
    foreach(var v in lst)
        System.Diagnostics.Trace.WriteLine(v);
    
    ...
    LinkedListNode<T> GetNode<T>(LinkedList<T> list, int index)
    {
        var cur = list.First;
        var ei = 0;
        while(cur != null)
        {
            if(ei++ == index)
                return cur;
            cur = cur.Next;
        }
        return null;
    }
    

    • Предложено в качестве ответа Abolmasov Dmitry 25 октября 2011 г. 16:53
    • Отменено предложение в качестве ответа asdfxcbneftyherwe 25 октября 2011 г. 17:05
    • Помечено в качестве ответа asdfxcbneftyherwe 25 октября 2011 г. 17:06
    25 октября 2011 г. 16:51
  • в общем в итоге всех мучений и на основании ваших подсказок удалось сгенерировать такой код:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace Lab07_1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Введите элементы вектора, разделяя их пробелом: ");
                string inputString = Console.ReadLine();
                string[] arrayString = inputString.Split(' ');
                double[] dArray = new double[arrayString.Length];
    
                for (int i = 0; i < arrayString.Length; i++)
                    dArray[i] = Convert.ToDouble(arrayString[i]);
    
    
                LinkedList<double> vectorList = new LinkedList<double>(dArray);
                double max = vectorList.Max();
    
                for (int i = 0; i < vectorList.Count; i++)
                {
                    double temp = vectorList.ElementAt(i);
                    dArray[i] /= max;
                }
    
                vectorList = new LinkedList<double>(dArray);
    
                Console.WriteLine("Нормализованный вектор: ");
                foreach (double temp in vectorList)
                    Console.Write("{0,7:F4}", temp);
    
                Console.ReadLine();
            }
        }
    }
    
    


    MSDN AA User
    25 октября 2011 г. 18:00

  • > for (int i = 0; i < vectorList.Count; i++) { 
           double temp = vectorList.ElementAt(i);
           ...
     

    получается в цикле for, на каждой итерации выполняется еще один цикл, скрытый в методе ElementAt.
    лучше заменить на примерно такое.
    var result = new LinkedList<double>();
    var cur = vectorList.First;
    while (cur != null)
    {
        result.AddLast(cur.Value / max);
        cur = cur.Next;
    }
    
     
    25 октября 2011 г. 18:11
  • Спасибо, поправился.
    MSDN AA User
    25 октября 2011 г. 18:46
  • На этот вопрос сложно будет ответить, зная, что вы не знаете как устроен связный список.  Вот тут вы можете посмотреть как делаются различные операции над списками.

    P.S. а почему не возник вопрос как удалить элемент из списка? :)

    26 октября 2011 г. 7:24
    Отвечающий
  • >P.S. а почему не возник вопрос как удалить элемент из списка? :) 

    А я в методах класса LinkedList увидел что-то типа метода Remove (или как то так), поэтому вопросов и не возникло (:


    MSDN AA User
    27 октября 2011 г. 15:06
  • Позвольте дам совет.

    Black-millenium, для общего развития: Выбор класса коллекции.

    Имхо, LinkedList в данном случае совершенно не в тему. Как уже советовали, List гораздо лучше.

    Как я понял, вы делаете на C# задания, которые даются в курсе по C++. На мой взгляд, напрямую пытаться делать это - не самый лучший вариант. Хотя бы потому, что в C# есть свои вкусные плюшки, с помощью которых многое можно сделать проще. Тот же Linq. В свою очередь в C++ есть свои особенности, например, алгоритмы STL. Думаю, в дальнейшем, когда пойдёт углубленное изучение C++, станет почти невозможно использовать C# напрямую.

    28 октября 2011 г. 5:31
  • А все-таки Антон был прав... >.< Препод заставил меня самому делать связанный список... ПОдскажииите... Чем на C# его лучше сделать? С помощью указателей (как это на С++ можно сделать) или чем нибудь ещё?
    MSDN AA User
    28 октября 2011 г. 11:31
  • А все-таки Антон был прав... >.< Препод заставил меня самому делать связанный список... ПОдскажииите... Чем на C# его лучше сделать?
        class Node
        {
            public Node next;
            public double val;
        }
    
    28 октября 2011 г. 11:46
    Отвечающий
  • Спасибо. ^_^
    И вопрос номер 2:
    на с++ код выглядит так:
    q->data = a;	// записываем данные в элемент списка
    

    Что значит оператор -> и чем его заменить в C#?

    MSDN AA User
    28 октября 2011 г. 12:01
  • Спасибо. ^_^
    И вопрос номер 2:
    на с++ код выглядит так:
    q->data = a;	// записываем данные в элемент списка
    

    Что значит оператор -> и чем его заменить в C#?

    MSDN AA User


    Это оператор доступа к полю класса, в C# это просто точка:

    node.val = a;

    А вообще-то такие вопросы не задают на форумах. Это элементарный синтаксис, который вы можете (и должны) прочесть в любой книге по C#/C++.

    28 октября 2011 г. 12:07
    Отвечающий
  • > ... связанный список... ПОдскажииите... [...] на C#  

     
    посмотреть реализацию LinkedList<T> можно в C:\Windows\Microsoft.net\Framework\v4.0.30319\System.dll, если открыть файл с помощь браузера .NET-сборок - http://en.wikipedia.org/wiki/.NET_Reflector (в статье есть ссылка на сайт рефлектора и на сайты его альтернатив).


    • Изменено Malobukv 28 октября 2011 г. 12:27
    28 октября 2011 г. 12:26
  • > ... связанный список... ПОдскажииите... [...] на C#  

     
    посмотреть реализацию LinkedList<T> можно в C:\Windows\Microsoft.net\Framework\v4.0.30319\System.dll, если открыть файл с помощь браузера .NET-сборок - http://en.wikipedia.org/wiki/.NET_Reflector (в статье есть ссылка на сайт рефлектора и на сайты его альтернатив).


    О, можно списать :D


    MSDN AA User
    28 октября 2011 г. 17:26
  • >>   class Node
    >>    {
    >>        public Node next;
                 public double val;
    >>    }

    Всё таки не понимаю. Я понимаю что поле val указывает на начало следующего члена списка, но не понимаю как с этим работать. Можно пример создания таким образом связанного списка из трёх значений?


    MSDN AA User
    29 октября 2011 г. 21:13
  • > Я понимаю что поле val указывает на начало следующего члена списка, но не понимаю как с этим работать.


     | prev
     ___
    |___| 
         |  next

     | prev
     ___
    |___| 
        |   next

    это двусвязный список; prev - это ссылка на предыдущий элемент, next - на следующий.
    у односвязных списков у элементов есть только prev или только next
    пример двусвязного списка:

    class Node
    {
        public Node Next;
        public Node Prev;
        public object Data;
    }
    ...
    var n1 = new Node { Data = 1 };
    var n2 = new Node { Data = 2, Prev = n1 };
    n1.Next = n2;
    var n3 = new Node { Data = 3, Prev = n2 };
    n2.Next = n3;






    • Помечено в качестве ответа asdfxcbneftyherwe 29 октября 2011 г. 21:32
    29 октября 2011 г. 21:30
  • Спасибо, вот теперь понятно :)
    MSDN AA User
    29 октября 2011 г. 21:35
  • В итоге получилось вот что:

    using System;
    
    namespace Lab07_1
    {
        class vectorList
        {
            private double Data;
            private vectorList Next;
    
            public vectorList(double incomingData, vectorList nextElement)
            {
                Data = incomingData;
                Next = nextElement;
            }
            
            public double GetData()
            {
                return Data;
            }
    
            public void SetData(double input)
            {
                Data = input;
            }
    
            public vectorList GetNext()
            {
                return Next;
            }
    
            public void SetNext(vectorList input)
            {
                Next = input;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Введите элементы вектора через пробел: ");
                string[] InputElements = Console.ReadLine().Split(' ');     //конвертируем строку в массив string
                double[] VectorElements = new double[InputElements.Length]; //создаём новый массив типа double
    
                for (int i = 0; i < InputElements.Length; i++)              //конвертируем каждый элемент string в double
                    VectorElements[i] = Convert.ToDouble(InputElements[i]);
    
                vectorList[] MyVector = new vectorList[VectorElements.Length];  //выделяем память под список
    
                MyVector[0] = new vectorList(VectorElements[0], null);  //первый элемент списка
    
                for (int i = 1; i < VectorElements.Length; i++)                 //заполняем список
                {
                    MyVector[i] = new vectorList(VectorElements[i], null);
                    MyVector[i - 1].SetNext(MyVector[i]);
                }
    
                double Max = 0;
                for (int i = 0; i < MyVector.Length; i++)   //находим max значение
                {
                    if (MyVector[i].GetData() > Max)
                        Max = MyVector[i].GetData();
                }
    
                for (int i = 0; i < MyVector.Length; i++)
                    MyVector[i].SetData(MyVector[i].GetData() / Max);       //нормализуем вектор
    
                Console.WriteLine("Нормализованный вектор: "); //вывод
                for (int i = 0; i < MyVector.Length; i++)
                    Console.Write("{0,4:F2} ", MyVector[i].GetData());
    
                Console.ReadLine();
            }
        }
    }
    
    

    Прошу комментариев ^_^


    MSDN AA User
    30 октября 2011 г. 6:48
  • Жуть... Зачем создавать список, что бы потом использовать массивы?

    Блин, закройте форум, откройте книжку >(

    30 октября 2011 г. 7:59
    Отвечающий
  • :\

    Какого автора посоветуете?

    ПС: вот Вы говорите массивы... А я просто не смог придумать ничего иного, кроме как них. Как ещё массив из n-элементов загнать в связанный список?


    MSDN AA User
    30 октября 2011 г. 18:14
  • > vectorList[] MyVector = new vectorList[VectorElements.Length];


    создавать массив из узлов одно/двусвязного списка не нужно.
    массив - это как коробка. в которую кладут элементы одинакового размера. зная ширину элемента - легко найти n-ный. это плюс. а минус в том, что если надо добавить элемент(ы), то надо взять коробку большего размера и перенести элементы из одной коробки в другую коробку.
    возможна ситуация, когда в шкафу/памяти не будет места для коробки. но останется много мест меньшего размера.
    поэтому придумали связные списки. когда каждый элемент сам себе коробка, в которой хранится также ссылка на другой элемент (следующий и/или предыдущий). редактировать связный список легко, надо только изменить ссылки у элементов.
    но чтобы найти n-ный элемент надо ходить по ссылкам и отсчитывать сколько элементов прошли.
    чтобы при добавлении элемента в конец списка, каждый раз не искать хвост, создают объект, который хранит ссылку на последний элемент. 

     

    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                var lst = new List<int>();
                lst.Add(1);
                lst.Add(2);
                lst.Add(3);
                foreach (var itm in lst.Nodes())
                    System.Diagnostics.Trace.WriteLine(itm.Data);
    
                var v1 = lst.Node(0);  // 1
                var v2 = lst.Node(5);  // null
                var v3 = lst.Node(2);  // 3
            }
        }
    
        class List<T>
        {
            public Node<T> Head { get; private set; }
            Node<T> Last;
            public void Add(T data)
            {
                var n = new Node<T> { Data = data };
                if (Last == null)
                    Head = Last = n;
                else
                {
                    Last.Next = n;
                    n.Prev = Last;
                    Last = n;
                }
            }
            public IEnumerable<Node<T>> Nodes()
            {
                var cur = Head;
                while (cur != null)
                {
                    yield return cur;
                    cur = cur.Next;
                }
            }
            public Node<T> Node(int index)
            {
                int cur = 0;
                foreach (var itm in Nodes())
                    if (cur++ == index)
                        return itm;
                return null;
            }
        }
        class Node<T>
        {
            public Node<T> Next;
            public Node<T> Prev;
            public T Data;
        }
    }
    

     


    • Изменено Malobukv 30 октября 2011 г. 18:51
    • Помечено в качестве ответа asdfxcbneftyherwe 30 октября 2011 г. 19:31
    30 октября 2011 г. 18:49
  • Конечный код:

    using System;
    
    namespace Lab07_1
    {
        class vectorList
        {
            private double Data;
            private vectorList Next;
    
            public vectorList(double incomingData, vectorList nextElement)
            {
                Data = incomingData;
                Next = nextElement;
            }
    
            /* Методы доступа к приватным полям */
            public double GetData()
            {
                return Data;
            }
            public void SetData(double input)
            {
                Data = input;
            }
            public vectorList GetNext()
            {
                return Next;
            }
            public void SetNext(vectorList input)
            {
                Next = input;
            }
    
            /* Находим максимальный элемент в списке */
            public double Max()
            {
                double Max = this.GetData();
                vectorList temp = this;
                while ((temp = temp.GetNext()) != null)
                {
                    if (Max < temp.GetData())
                        Max = temp.GetData();
                }
                return Max;
            }
    
            /* Делим каждый элемент списка на какое либо число */
            public void DivieByVal(double Val)
            {
                vectorList temp = this;
                do
                {
                    temp.SetData(temp.GetData() / Val);
                } while ((temp = temp.GetNext()) != null);
            }
    
            /* Печатаем список */
            public void PrintList()
            {
                vectorList temp = this;
                do
                {
                    Console.Write("{0:F3} ", temp.GetData());
                } while ((temp = temp.GetNext()) != null);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                
                Console.WriteLine("Введите элементы вектора через пробел: ");
                string[] InputElements = Console.ReadLine().Split(' ');     //конвертируем строку в массив string
                double[] VectorElements = new double[InputElements.Length]; //создаём новый массив типа double
    
                for (int i = 0; i < InputElements.Length; i++)              //конвертируем каждый элемент string в double
                    VectorElements[i] = Convert.ToDouble(InputElements[i]);
    
                vectorList MyVector = null;
                for (int i = VectorElements.Length-1; i >= 0; i--)
                    MyVector = new vectorList(VectorElements[i], MyVector);
    
                MyVector.DivieByVal(MyVector.Max());
                MyVector.PrintList();
    
                Console.ReadKey();
            }
        }
    }
    
    

    Теперь правильно?


    MSDN AA User
    31 октября 2011 г. 3:43
  • >Теперь правильно?

    Да уже лучше. Кстати, имена локальных переменных принято писать с малой буквы.

    Касаемо книжек, из серьезных вот эти:

    • Ахо, Хопкрофт, Ульман. Структуры данных и алгоритмы.
    • Кнут. Искусство программирования.

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

    31 октября 2011 г. 5:13
    Отвечающий
  • Ещё пара моментов:

            public double GetData()
            {
                return Data;
            }
            public void SetData(double input)
            {
                Data = input;
            }

    Подобные вещи проще делать через свойства

    А слабо сделать generic список? Список, в который вы будете класть не только double или унылый object, а будете работать с выбраным типом.

    И совсем было бы круто, если бы вы унаследовали свой список от IEnumerable<T>.

     

     

     

    31 октября 2011 г. 9:41
    Отвечающий
  • И вдогонку:

    public void PrintList()
    public void DivieByVal(double Val)

    Подобные методы не должны быть в классе vectorList (называние класса с маленькой буквы? Фи). У вас сейчас идет смешение логики. Эти методы вполне можно вынести в Program класс.

     

    31 октября 2011 г. 9:44
    Отвечающий
  • >>Кнут. Искусство программирования.

    Так и не соберусь никак почитать его :(

     

    >>Подобные вещи проще делать через свойства

    А можно поинтересоваться, чем вкратце отличаются свойства класса от его полей?

     

    >>А слабо сделать generic список? Список, в который вы будете класть не только double или унылый object, а будете работать с выбраным типом.

    >>И совсем было бы круто, если бы вы унаследовали свой список от IEnumerable<T>.

    >.<

     

    >>Подобные методы не должны быть в классе vectorList (называние класса с маленькой буквы? Фи). У вас сейчас идет смешение логики. Эти >>методы вполне можно вынести в Program класс.

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


    MSDN AA User
    1 ноября 2011 г. 6:52
  • Пожалуйста, не раздувайте топик до базовых вопросов синтаксиса языка и до ООП. Раз вы взялись изучать C# сами, то начните с чтения книги, тогда половину вопросов отпадет само собой, а то что будет неясно или будут возникать какие-то проблемы с кодом, то спрашивайте на форуме.

    Касательно связного списка - вроде все уже разобрали выше и разложили по полочкам.

    Спасибо.


    Для связи [mail]
    • Изменено Abolmasov Dmitry 1 ноября 2011 г. 7:26
    • Помечено в качестве ответа asdfxcbneftyherwe 1 ноября 2011 г. 8:28
    • Снята пометка об ответе Abolmasov Dmitry 1 ноября 2011 г. 9:47
    1 ноября 2011 г. 7:26
  • >>Подобные вещи проще делать через свойства

    А можно поинтересоваться, чем вкратце отличаются свойства класса от его полей?

     

    2 ноября 2011 г. 22:15
  • А по линке все написано про это ;) Относитесь к ним как к методам (собственно, в них свойства и превращаются) и тогда станет все на свои места. Свойство можно объявить в интерфейсе, его можно переопределить, в него можно засунуть недюжую логику. Всего этого поля не смогут предоставить, как и много другого.
    3 ноября 2011 г. 7:41
    Отвечающий