Необходимо было реализовать кольцевой список. Сделал через методы расширения. Но есть один нюанс. Как реализовать возврат из метода первого значения в узле? В данном случае у меня возвращается при первом проходе всегда второе значение ("Таня"), потом после последнего узла, переход к первому значению.
class Program
{
static void Main(string[] args)
{
// Создадим связный список
LinkedList<string> linkedList = new LinkedList<string>();
// Добавим несколько элементов
linkedList.AddFirst("Вася");
linkedList.AddFirst("Петя");
linkedList.AddFirst("Таня");
linkedList.AddFirst("Коля");
// Отобразим элементы в прямом направлении
LinkedListNode<string> node;
Console.WriteLine("Элементы коллекции в прямом направлении: ");
for (node = linkedList.First; node != null; node = node.Next)
Console.Write(node.Value + "\t");
Console.WriteLine();
var result = GetValue(linkedList.First);
Console.WriteLine($"+++++++ {result} ++++++++");
Console.ReadKey();
}
private static string GetValue(LinkedListNode<string> node)
{
node = CircularLinkedList.NextOrFirst(node);
return node.Value;
}
}
Extension метод для односвязного списка:
public static class CircularLinkedList
{
public static LinkedListNode<T> NextOrFirst<T>(this LinkedListNode<T> current)
{
return current.Next ?? current.List.First;
}
public static LinkedListNode<T> PreviousOrLast<T>(this LinkedListNode<T> current)
{
return current.Previous ?? current.List.Last;
}
}
У метода GetValue
неправильное название:
private static string GetNextCircularValue(LinkedListNode<string> node)
{
node = CircularLinkedList.NextOrFirst(node);
return node.Value;
}
Возможно, Вы хотели сделать следующее:
private static string GetValueAndAdvance(ref LinkedListNode<string> node)
{
string result = node.Value;
node = CircularLinkedList.NextOrFirst(node);
return result;
}
node = linkedList.First;
var result = GetValueAndAdvance(ref node);
Так как в данном коде
private static string GetValue(LinkedListNode<string> node)
{
node = CircularLinkedList.NextOrFirst(node);
return node.Value;
}
сначала получается следующий элемент, а только потом берется значение, при передаче первого элемента значение будет получено у следующего.
Для решения, достаточно передавать не первый элемент, а последний:
var result = GetValue(linkedList.Last);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть TextBlock, в нем находится несколько элементов RunМожно ли как-то динамически менять эти элементы через Binding? Абстрактно это выглядит вот так
Как правильно будет сделать метод, и конвертацию данной строки? Хочу вытянуть сумму, потом после действия сравнить подскажите как будет правильноТак...