C # Доступ к свойствам элемента при циклическом просмотре универсального LinkedList <T> - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь сделать что-то, что я думал, было бы очень просто. Но это не работает, и я не могу понять, почему. Я также сбит с толку, почему я так много искал и не могу найти пример циклического перебора общего связанного списка и доступа к свойствам объектов, содержащихся в связанном списке. Кажется, что это было бы настолько просто, что было бы множество примеров.

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

    private LinkedList<MyObject> _genericLinkedListOfMyObjects;

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

MyObject - это базовый класс со свойствами:

public class MyObject
{
    public string property1 { get; set; }
    public string property2 { get; set; }
}

Ни одна из следующих работ:

foreach (MyObject item in genericLinkedListOfMyObjects)
{
    item.property1; //NOPE!
}

Это приводит к ошибке компилятора "MyObject" не содержит определения 'property1' и не имеет доступного метода расширения 'property1'можно найти первый аргумент типа 'MyObject' (отсутствует директива using или ссылка на сборку)? "

Nor

LinkedListNode<MyObject> current = genericLinkedListOfMyObjects.First;
while (current !=null)
{
    current.Value.property1; //NOPE!
}

Это приводит к ошибке компилятора" 'MyObject'не содержит определения' property1 ', и невозможно найти доступный метод расширения' property1 ', принимающий первый аргумент типа' MyObject '(вы пропустилиctive или ссылка на сборку)? "

Nor

foreach (var item in genericLinkedListOfMyObjects)
{
    MyObject myObj = item as MyObject; //NOPE!  
}

Это приводит к ошибке компиляции" Параметр типа "MyObject" нельзя использовать с оператором "as", поскольку он не имеетограничение типа или ограничение класса.

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

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Ваш код, который вы вставили, был неполным, поэтому из-за кода выше могут возникнуть проблемы. Я могу просто предположить пару из них:

while (current !=null)
{
    current.Value.property1; //NOPE!
}

Вы получите эту ошибку: только оператор assignemt, call, increment, decment, await и new object могут быть использованы в качестве оператора.

Таким образом, вы должны что-то сделать с current.Value.property1, либо присвоить его какой-либо переменной, вызвать другой метод, увеличить и т. Д. ...

Также здесь у вас есть:

foreach (MyObject item in genericLinkedListOfMyObjects)

но выше ваша переменная вызывается с префиксом "_". Трудно сказать, основываясь на коде, который вы вставили здесь. Таким образом, либо у вас есть 2 поля, либо ваш цикл должен использовать _genericLinkedListOfMyObjects, как указано здесь:

private LinkedList<MyObject> _genericLinkedListOfMyObjects;

Пример кода:

Вот небольшое консольное приложение, в котором вы можете увидетькак работать с LinkedList на основе ваших попыток.

using System;
using System.Collections.Generic;

namespace TestLinkedList
{
    class Program
    {
        static void Main(string[] args)
        {
            var test = new TestLinkedList();
            test.Test1();
            Console.WriteLine();
            test.Test2();
            Console.WriteLine();
            test.Test3();
            Console.WriteLine();
            Console.WriteLine("Done!");
            Console.ReadKey();
        }
    }

    public class MyObject
    {
        public string property1 { get; set; }
        public string property2 { get; set; }
    }

    public class TestLinkedList
    {
        private LinkedList<MyObject> _genericLinkedListOfMyObjects; 

        public void Test1()
        {
            Console.WriteLine("Test1");
            _genericLinkedListOfMyObjects = new LinkedList<MyObject>();
            _genericLinkedListOfMyObjects.AddFirst(new MyObject{ property1="Prop1 Test1", property2="Prop2 Test1" });
            _genericLinkedListOfMyObjects.AddFirst(new MyObject{ property1="Prop1 Test2", property2="Prop2 Test2" });

            foreach (MyObject item in _genericLinkedListOfMyObjects)
            {
                Console.WriteLine(item.property1);
                Console.WriteLine(item.property2);
            }
        }

        public void Test2()
        {
            Console.WriteLine("Test2");
            _genericLinkedListOfMyObjects = new LinkedList<MyObject>();
            _genericLinkedListOfMyObjects.AddFirst(new MyObject{ property1="Prop1 Test1", property2="Prop2 Test1" });
            _genericLinkedListOfMyObjects.AddFirst(new MyObject{ property1="Prop1 Test2", property2="Prop2 Test2" });

            LinkedListNode<MyObject> current = _genericLinkedListOfMyObjects.First;
            while (current !=null)
            {
                Console.WriteLine(current.Value.property1);
                Console.WriteLine(current.Value.property2);
                current = current.Next;
            }
        }

        public void Test3()
        {
            Console.WriteLine("Test3");
            _genericLinkedListOfMyObjects = new LinkedList<MyObject>();
            _genericLinkedListOfMyObjects.AddFirst(new MyObject{ property1="Prop1 Test1", property2="Prop2 Test1" });
            _genericLinkedListOfMyObjects.AddFirst(new MyObject{ property1="Prop1 Test2", property2="Prop2 Test2" });

            LinkedListNode<MyObject> current = _genericLinkedListOfMyObjects.First;
            foreach (var item in _genericLinkedListOfMyObjects)
            {
                MyObject myObj = item as MyObject; //NOPE!
                Console.WriteLine(myObj.property1);
                Console.WriteLine(myObj.property2);
            }
        }
    }
}
0 голосов
/ 07 октября 2019

Хорошо, @Ed ты был прав, что-то еще происходит. Я буду работать над выяснением, что это такое. Но мне приятно знать, что это что-то с пространствами имен, а не что-то неожиданное с LinkedLists.

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestLinkedList1
{
    public class TestClass
    {

        public void DoStuff()
        {
            MyObject myobj1 = new MyObject();
            MyObject myobj2 = new MyObject();

            myobj1.property1 = "Foo";
            myobj2.property1 = "Bar";

            LinkedList<MyObject> genericLinkedListofMyObjects = new LinkedList<MyObject>();

            genericLinkedListofMyObjects.AddFirst(myobj1);
            genericLinkedListofMyObjects.AddFirst(myobj2);

            foreach (var item in genericLinkedListofMyObjects)
            {
                string mystring = item.property1; //WORKS!
            }

        }

    }

    public class MyObject
    {
        public string property1 { get; set; }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...