我正在尝试做一些我认为非常简单的事情。但它不起作用,我不知道为什么。我也很困惑为什么我搜索了这么多,找不到循环遍历通用链接列表并访问链接列表中包含的对象属性的示例。看起来这太基本了,会有很多例子。
我在我的类中有一个定义为私有字段的通用链表,具有相应的公共属性。
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'的定义,并且找不到接受类型为'MyObject'的第一个参数的可访问扩展方法'property1'(您是否缺少使用指令或程序集引用(?
也不
LinkedListNode<MyObject> current = genericLinkedListOfMyObjects.First;
while (current !=null)
{
current.Value.property1; //NOPE!
}
这会导致编译器错误"'MyObject'不包含'property1'的定义,并且找不到接受类型为'MyObject'的第一个参数的可访问扩展方法'property1'(您是否缺少使用指令或程序集引用(?
也不
foreach (var item in genericLinkedListOfMyObjects)
{
MyObject myObj = item as MyObject; //NOPE!
}
这会导致编译错误"类型参数'MyObject'不能与'as'运算符一起使用,因为它没有类类型约束或'类'约束。
如何在循环访问时访问通用链表中项目的 property1 值?提前谢谢你。
您粘贴的代码不完整,因此上面的代码可能存在多个问题。我可以假设其中的几个:
while (current !=null)
{
current.Value.property1; //NOPE!
}
您将收到此错误: 只有赋值、调用、递增、递减、等待和新对象表达式可以用作语句。
所以你必须对电流做点什么。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);
}
}
}
}
好的,@Ed你是对的,还有其他事情正在发生。我将努力弄清楚那是什么。但我很欣慰地知道它是带有命名空间的东西,而不是 LinkedList 的意外。
所以是的,以下内容工作得很好。感谢您指出问题的可能来源,并且您认为我的代码应该可以正常工作。
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; }
}
}