Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
5 / 4 / 1
Регистрация: 23.09.2012
Сообщений: 48
1

Двусвязный список

11.10.2018, 09:50. Просмотров 2290. Ответов 5
Метки нет (Все метки)


Приветствую всех. Искал информацию про двусвязный список нашел вот это
ТЫК, кое что доже понял

Вопрос разъясните почему используется наследование от интерфейса IEnumerable<T>
И как я могу изменить какой нибудь элемент списка
C#
1
 linkedList.ElementAt(i).Last_Name = Console.ReadLine(); //Не удалось изменить возвращаемое значение "Enumerable.ElementAt<UserInfo>(IEnumerable<UserInfo>, int)", т.*к. оно не является переменной
Почему так? Как я понял то интерфейс ICollection<T> возвращает только данне для чтения.
Запутался в общем, расскажите что к чему
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2018, 09:50
Ответы с готовыми решениями:

Двусвязный список
Вот задание: 1. Считать из текстового файла исходные данные и на их основе создать необходимые...

Двусвязный список
Всем привет Есть пример создания двусвязного списка ...

Двусвязный список
Сказали реализовать двусвязный список, считывая данные для списка из файла. Какие данные могут быть...

Двусвязный список на языке C#
В программе должны быть реализованы два типа: открытый (public) тип списка – List; внутренний...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
5
294 / 123 / 106
Регистрация: 30.10.2015
Сообщений: 690
11.10.2018, 10:44 2
Цитата Сообщение от Chiker Посмотреть сообщение
Вопрос разъясните почему используется наследование от интерфейса IEnumerable<T>
Потому что в коде по ссылке есть
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        IEnumerator IEnumerable.GetEnumerator()
        {
            return ((IEnumerable)this).GetEnumerator();
        }
 
        IEnumerator<T> IEnumerable<T>.GetEnumerator()
        {
            DoublyNode<T> current = head;
            while (current != null)
            {
                yield return current.Data;
                current = current.Next;
            }
        }
Цитата Сообщение от Chiker Посмотреть сообщение
Искал информацию про двусвязный список
Если Вы только разбираетесь со списками, лучше начните с реализации односвязного.

Добавлено через 1 минуту
И делайте его на необобщенном типе, так Вы избавитесь от ненужных деталей.
0
Неадекват
1436 / 1189 / 230
Регистрация: 02.04.2010
Сообщений: 2,719
11.10.2018, 11:10 3
Цитата Сообщение от Chiker Посмотреть сообщение
Запутался в общем, расскажите что к чему
В дотнете есть реализация двухсвязного списка, называется LinkedList<T>. Можете поиграться.

Но на практике в дотнете одно и двухсвязные списки используются редко. Не так много задач где они имеют преимущество перед обычными списками.
0
Администратор
Эксперт .NET
13118 / 10689 / 4409
Регистрация: 17.03.2014
Сообщений: 21,522
Записей в блоге: 1
11.10.2018, 17:05 4
Цитата Сообщение от Chiker Посмотреть сообщение
Вопрос разъясните почему используется наследование от интерфейса IEnumerable<T>
Для возможности перебора всех элементов списка.

Цитата Сообщение от Chiker Посмотреть сообщение
И как я могу изменить какой нибудь элемент списка
C#
1
linkedList.ElementAt(i).Last_Name = Console.ReadLine(); //Не удалось изменить возвращаемое значение "Enumerable.ElementAt<UserInfo>(IEnumerable<UserInfo>, int)", т.*к. оно не является переменной
Почему так?
Покажи весь код
1
5 / 4 / 1
Регистрация: 23.09.2012
Сообщений: 48
12.10.2018, 04:46  [ТС] 5
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
 public class DoublyLinkedList<T> : IEnumerable<T>// двусвязный список
    {
        DoublyNode<T> head; // головной/первый элемент
        DoublyNode<T> tail; // последний/хвостовой элемент
        int count;  // количество элементов в списке
 
        // добавление элемента
        public void Add(T data)
        {
            DoublyNode<T> node = new DoublyNode<T>(data);
 
            if (head == null)
                head = node;
            else
            {
                tail.Next = node;
                node.Previous = tail;
            }
            tail = node;
            count++;
        }
        // удаление
        public bool Remove(T data)
        {
            DoublyNode<T> current = head;
 
            // поиск удаляемого узла
            while (current != null)
            {
                if (current.Data.Equals(data))
                {
                    break;
                }
                current = current.Next;
            }
            if (current != null)
            {
                // если узел не последний
                if (current.Next != null)
                {
                    current.Next.Previous = current.Previous;
                }
                else
                {
                    // если последний, переустанавливаем tail
                    tail = current.Previous;
                }
 
                // если узел не первый
                if (current.Previous != null)
                {
                    current.Previous.Next = current.Next;
                }
                else
                {
                    // если первый, переустанавливаем head
                    head = current.Next;
                }
                count--;
                return true;
            }
            return false;
        }
 
        public int Count { get { return count; } }
        public bool IsEmpty { get { return count == 0; } }
 
        public void Clear()
        {
            head = null;
            tail = null;
            count = 0;
        }
 
        public bool Contains(T data)
        {
            DoublyNode<T> current = head;
            while (current != null)
            {
                if (current.Data.Equals(data))
                    return true;
                current = current.Next;
            }
            return false;
        }
 
        IEnumerator IEnumerable.GetEnumerator()
       {
           return ((IEnumerable)this).GetEnumerator();
       }
 
        IEnumerator<T> IEnumerable<T>.GetEnumerator()
        {
            DoublyNode<T> current = head;
            while (current != null)
            {
                yield return current.Data;
                current = current.Next;
            }
        }
 
        public IEnumerable<T> BackEnumerator()
        {
            DoublyNode<T> current = tail;
            while (current != null)
            {
                yield return current.Data;
                current = current.Previous;
            }
        }
 
    }
C#
1
2
3
4
5
6
7
8
9
10
    public class DoublyNode<T>
    {
        public DoublyNode(T data)
        {
            Data = data;
        }
        public T Data { get; set; }
        public DoublyNode<T> Previous { get; set; }
        public DoublyNode<T> Next { get; set; }
    }
Вот метод откуда все вызываю, список и массив структур уже создан, и приходит с другого метода
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
  static void SearchAndEditInList(DoublyLinkedList<UserInfo> linkedList, UserPredm[] arrUserPredm, string lastName)//
        {
            Console.Clear();
 
            if (linkedList != null)
            {
                if (linkedList.Count > 0)
                {
                    for (int i = 0; i < linkedList.Count; i++)
                    {
                        if (linkedList.ElementAt(i).Last_Name==lastName)
                        {                                                    
 
                            Console.WriteLine("Введите фамилию.... \t Старое значение: " + linkedList.ElementAt(i).Last_Name);
                            SendKeys.SendWait(linkedList.ElementAt(i).Last_Name);
 
                            linkedList.ElementAt(i).Last_Name = Console.ReadLine(); // ВОТ ТУТ ОШИБКА
                        }
                    }
 
                }
                else { Console.WriteLine("В списке нет записей введите 3 чтобы добавить"); }
            }
            else { Console.WriteLine("Список не создан введиете 1 для создания"); }
 
        }
0
Администратор
Эксперт .NET
13118 / 10689 / 4409
Регистрация: 17.03.2014
Сообщений: 21,522
Записей в блоге: 1
12.10.2018, 16:32 6
Лучший ответ Сообщение было отмечено Chiker как решение

Решение

Chiker, у тебя очевидно UserInfo это структура. Сделай ее классом.

Добавлено через 28 минут
Еще в классе DoublyLinkedList<T> есть ошибка. Метод IEnumerable.GetEnumerator нужно переписать так чтобы он не зацикливался
C#
1
2
3
4
IEnumerator IEnumerable.GetEnumerator()
{
    return ((IEnumerable<T>)this).GetEnumerator();
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2018, 16:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

Двусвязный циклический список
Скажите как сделать список в моей программе циклическим? Как прописать файловые указатели на...

Двусвязный линейный список?
Всем доброго дня! Помогите пожалуйста. Есть задача: Дан двусвязный линейный список с целыми...

Циклический двусвязный список
Доброго времени суток! Собственно вот в чем вопрос: имеется двусвязный циклический список и нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.