Кольцевой односвязанный список C#

201
16 января 2019, 04:20

Необходимо было реализовать кольцевой список. Сделал через методы расширения. Но есть один нюанс. Как реализовать возврат из метода первого значения в узле? В данном случае у меня возвращается при первом проходе всегда второе значение ("Таня"), потом после последнего узла, переход к первому значению.

 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;
    }
}

Answer 1

У метода 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);
Answer 2

Так как в данном коде

private static string GetValue(LinkedListNode<string> node) 
{
    node = CircularLinkedList.NextOrFirst(node);
    return node.Value;
}

сначала получается следующий элемент, а только потом берется значение, при передаче первого элемента значение будет получено у следующего.

Для решения, достаточно передавать не первый элемент, а последний:

var result = GetValue(linkedList.Last);
READ ALSO
Binding коллекции Run в TextBlock

Binding коллекции Run в TextBlock

Есть TextBlock, в нем находится несколько элементов RunМожно ли как-то динамически менять эти элементы через Binding? Абстрактно это выглядит вот так

145
Как правильно будет сделать метод, и конвертацию данной строки

Как правильно будет сделать метод, и конвертацию данной строки

Как правильно будет сделать метод, и конвертацию данной строки? Хочу вытянуть сумму, потом после действия сравнить подскажите как будет правильноТак...

193
Дубликаты ссылок mscorlib в Roslyn при компиляции

Дубликаты ссылок mscorlib в Roslyn при компиляции

Путь кdll файлам брал от сюда:

193