Вот код. Что делает, понять не могу. Да, методы делают сериализацию и обратно, но, например, что делает строка List<ListNode> arr = new List<ListNode>();
?
public void Serialize(FileStream s)
{
List<ListNode> arr = new List<ListNode>();
ListNode temp = new ListNode();
temp = Head;
//transform nodes into List
do
{
arr.Add(temp);
temp = temp.Next;
} while (temp != null);
//write into file; data is modify for store index of .Random node
using (StreamWriter w = new StreamWriter(s))
foreach (ListNode n in arr)
w.WriteLine(n.Data.ToString() + ":" + arr.IndexOf(n.Rand).ToString());
}
public void Deserialize(FileStream s)
{
List<ListNode> arr = new List<ListNode>();
ListNode temp = new ListNode();
Count = 0;
Head = temp;
string line;
//try read file and create List of nodes
try
{
using (StreamReader sr = new StreamReader(s))
{
while ((line = sr.ReadLine()) != null)
{
if (!line.Equals(""))
{
Count++;
temp.Data = line;
ListNode next = new ListNode();
temp.Next = next;
arr.Add(temp);
next.Prev = temp;
temp = next;
}
}
}
//declare Tail
Tail = temp.Prev;
Tail.Next = null;
//return refs to Random nodes and restore Data
foreach (ListNode n in arr)
{
n.Rand = arr[Convert.ToInt32(n.Data.Split(':')[1])];
n.Data = n.Data.Split(':')[0];
}
}
В этих кавычках пишется обобщенный тип. В подсказках тебе будет показывать только список такого типа List<T>
тут T
это тот самый обобщенный тип который позволяет работать с любим типом данных только нужно наперед указать его в объявлении класса. Для чего это?
Вот в пример тебе обобщенный метод не класс на методе будет нагляднее но суть от этого почти не измениться:
void Swap<T>(ref T a,ref T b){
T temp = a;
a = b;
b = temp;
}
Всем известный метод смена переменных значениями. Но что тут делает какой-то тип T
в треугольных кавычках? Это что-то на подобие object
но во время вызова метода пользователь должен указать в этих кавычках какой тип данных принимает метод в качестве аргумента. Да, конечно, вы могли перегрузить метод для всех типов которые вы будете использовать? Но зачем (если вы не индус кончено), если можно сделать такой элегантный и простой код. В библиотеке классов System.Collections.Generics
собраны несколько классов для работы с обобщенными типами, такие как: List<T>
, Dictionary<K,V>
, Queue<T>
, Stack<T>
и так далее. Вы наверное успели заметить какие-то другие буквы помимо Т
в Dictionary<K,V>
. Да в этом почти никакого отличия и нету. Вы можете как захотите назвать этот тип. Но принято если тип 1 то называть его T
, а если 2 то T,U
.
Теперь о коде. Если конкретно о коде который Вы попросили объяснить в комментариях:
List<ListNode> arr = new List<ListNode>(); //Список экземпляров класса ListNode (динамический массив)
ListNode temp = new ListNode(); //Новый экземпляр класса ListNode
temp = Head;//Присваивание экземпляру класса ListNode значение Head
//В цикле мы все узлы из файла переносим в список для дальнейшей работы с ним.
do
{
arr.Add(temp);//Тут мы добавляем в список узел
temp = temp.Next;//Тут мы переходим к следующему
} while (temp != null);//Пока узлы существуют
Думаю мой небольшой рассказ помог Вам понять предназначение обобщенных типов. Подробнее о них можете почитать по данной ссылке
SeeSharp
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
На хостинге работало все нормально,как только перенес на vps ошибкалоги тут -
как сделать в input type=date так, что бы допустим щас 2018 год и в этом инпуте можно было выбрать дату только до 2018 года, если 2019 до 2019 , думаю смысл...
Есть таблица вот такая, все данные подгружаются из БД, каждый раз количество столбцов может быть разное