Почему я не могу наследовать LinkedListNode <T>?

При помощи LINQ это должно работать;

string delimiter = ",";
List<string> items = new List<string>() { "foo", "boo", "john", "doe" };
Console.WriteLine(items.Aggregate((i, j) => i + delimiter + j));

описание класса:

public class Foo
{
    public string Boo { get; set; }
}

Использование:

class Program
{
    static void Main(string[] args)
    {
        string delimiter = ",";
        List<Foo> items = new List<Foo>() { new Foo { Boo = "ABC" }, new Foo { Boo = "DEF" },
            new Foo { Boo = "GHI" }, new Foo { Boo = "JKL" } };

        Console.WriteLine(items.Aggregate((i, j) => new Foo{Boo = (i.Boo + delimiter + j.Boo)}).Boo);
        Console.ReadKey();

    }
}

И вот мое лучшее :)

items.Select(i => i.Boo).Aggregate((i, j) => i + delimiter + j)
6
задан Martin 25 August 2009 в 23:10
поделиться

7 ответов

Вы используете его неправильно.

.AddLast (T) метод возвращает узел связанного списка. Он указывает на ваш день и содержит предыдущие и следующие функции, которые вы ищете.

2
ответ дан 8 December 2019 в 17:24
поделиться

Во-первых, LinkedListNode запечатан , поэтому он не может быть унаследован.

Во-вторых, LinkedListNode действительно содержит свойства Предыдущие и Следующие , которые относятся к предыдущему и следующему узлам в LinkedList , откуда был получен данный экземпляр LinkedListNode .

Наконец. , чтобы правильно использовать AddLast , вы должны сделать следующее:

Day d1 = new Day();
Day d2 = new Day();
LinkedList<Day> days = new LinkedList<Day>();
LinkedListNode<Day> node1 = days.AddLast(d1);
LinkedListNode<Day> node2 = days.AddLast(d2);

// now node1.Next refers to node containing d2
// and node2.Previous referes to node containing d1
12
ответ дан 8 December 2019 в 17:24
поделиться
Day d1 = new Day();
Day d2 = new Day();
LinkedList<Day> days = new LinkedList<Day>();
// Day's instance doesn't have Next. Its the LinkedListNode that should be used.
LinkedListNode<Day> d1Node = days.AddLast(d1); 
days.AddLast(d2);
0
ответ дан 8 December 2019 в 17:24
поделиться

Согласно MSDN , класс LinkedListNode не может быть унаследован.

Майкл указывает, что это сообщение в блоге Эрика Липперта говорит о том, почему многие классы в структуре закрыты

1
ответ дан 8 December 2019 в 17:24
поделиться

Почему бы просто не использовать узлы напрямую, чтобы начать с ...

LinkedListNode<Day> d1 = new LinkedListNode<Day>(new Day());
LinkedListNode<Day> d2 = new LinkedListNode<Day>(new Day());
LinkedList<Day> days = new LinkedList<Day>();
days.AddLast(d1); 
days.AddLast(d2);

// Now you can read the node directly
d1.Next...

// If you need to place it somewhere other than at the end (like say you want d2 before d1,
// but d1 is already in the list) use 'AddBefore' and 'AddAfter' eg:
days.AddLast(d2);
days.AddBefore(d2, d1);
0
ответ дан 8 December 2019 в 17:24
поделиться

LinkedListNode - это запечатанный класс, поэтому его нельзя унаследовать . IEnumerable настолько избаловал нас, что мы упускаем из виду фактические структуры данных, которые мы используем. Это по-прежнему связанный список, поэтому вы можете рассматривать его как один:

LinkedListNode<Day> node = days.First();
while (node != null)
{
    Day day = node.Value;

    // do stuff here...

    node = node.Next();
}
-1
ответ дан 8 December 2019 в 17:24
поделиться

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

public interface ILinkedListNode
{
    ILinkedListNode Next { get; set; }
    ILinkedListNode Previous { get; set; }
}

public class LinkedList<T> where T : ILinkedListNode 
{
    /*.... methods here ...*/
}

public class Node : ILinkedListNode
{
    public Node Next { get; set; }

    public Node Previous { get; set; }

    ILinkedListNode ILinkedListNode.Next
    {
        get { return this.Next; }
        set { this.Next = (Node)value; }
    }

    ILinkedListNode ILinkedListNode.Previous
    {
        get { return this.Previous; }
        set { this.Previous = (Node)value; }
    }
}
0
ответ дан 8 December 2019 в 17:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: