C # не может связать узлы в LinkedList - PullRequest
0 голосов
/ 16 мая 2018

Я расширяю двойной связанный список C # как средство создания пользовательской структуры данных для алгоритма механизма правил, над которым я работаю.К сожалению, элементы в связанном списке после создания экземпляра фактически никогда не связаны:

public abstract class DependencyTree<TTreeLeaf,TTreeLeafNode>
                    : LinkedList<LinkedListNode<TTreeLeaf>>
                    where TTreeLeaf : DependencyTreeLeaf
                    where TTreeLeafNode : DependencyTreeLeafNode
{
    #region Constructors
    public DependencyTree(ICollection<TTreeLeaf> leaves)
    {
        foreach (var leaf in leaves)
        {
            AddLast(new LinkedListNode<TTreeLeaf>(leaf));
        }
        var y = this.Where(node => node.Next != null || node.Previous != null).Count();
        Console.WriteLine(y.ToString());
    }
    #endregion Constructors

Вышеприведенное всегда возвращает 0, независимо от того, сколько листьев я прохожу.

Какой правильный путьчтобы убедиться, что мои листья на самом деле связаны?Я бы предпочел не использовать еще одну пользовательскую структуру данных, когда в .NET она уже доступна.Любые советы приветствуются.

***** РЕДАКТИРОВАТЬ *****

//Addition of DependencyLeaf definition
    public abstract class DependencyTreeLeaf 
        : LinkedList<LinkedListNode<DependencyTreeLeafNode>>
    {
        #region Constructors
        public DependencyTreeLeaf(IEnumerable<DependencyTreeLeafNode> leafNodes, DependencyState siblingDependency = DependencyState.Unset, IEnumerable<DependencyTreeLeaf> children = null, DependencyState childDependency = DependencyState.Unset)
        {
            foreach (var leaf in leafNodes)
            {
                    AddLast(new LinkedListNode<DependencyTreeLeafNode>(leaf));
            }

            if (children != null)
            {
                Children = new LinkedList<LinkedListNode<DependencyTreeLeaf>>();
                foreach (var childLeaf in children)
                {
                    Children.AddLast(new LinkedListNode<DependencyTreeLeaf>(childLeaf));
                }
            }

            SiblingForwardDependency = siblingDependency;
            ChildDownwardDependency = childDependency;
            }
     }

1 Ответ

0 голосов
/ 16 мая 2018

вы добавляете свои собственные узлы связанного списка, вам не нужно это делать, связанный список сделает это.Вы добавляете эти LinkedListNode s в фактические LinkedListNode s, следовательно, ваши не имеют никаких предыдущих или последующих поддерживаемых.Однако проблема, с которой вы сталкиваетесь, заключается в том, что IEnumerable будет выполнять итерацию по TTreeLeaf, а не по узлам.

Если вы хотите перебрать сами узлы, вам нужно что-то вроде: -

 public class DependencyTree<TTreeLeaf, TTreeLeafNode>
        : LinkedList<TTreeLeaf>
        where TTreeLeaf : DependencyTreeLeaf
        where TTreeLeafNode : DependencyTreeLeafNode
    {

        public DependencyTree(ICollection<TTreeLeaf> leaves)
        {
            foreach (var leaf in leaves)
            {
                AddLast(leaf);
            }                 

            var y = this.Nodes().Count(node => node.Next != null || node.Previous != null);
            Console.WriteLine(y.ToString());
        }

        public IEnumerable<LinkedListNode<TTreeLeaf>> Nodes()
        {
            var node = this.First;
            while (node != null)
            {
                yield return node;
                node = node.Next;
            }
        }
    }

вы, конечно, можете просто пойти this.Count();

...