我是C#的新手,我正在尝试使用LinkedList<T>
class News {
private int Id { get; set; }
private string Name { get; set; }
public News (int id, string name) {
Id = id;
Name = name;
}
public string getName() {
return Name;
}
}
class Program {
static void Main(string[] args) {
var newsList = new LinkedList<LinkedListNode<News>>();
newsList.AddLast(new LinkedListNode<News>(new News(1,"News first")));
newsList.AddLast(new LinkedListNode<News>(new News(2, "News second")));
newsList.AddLast(new LinkedListNode<News>(new News(3, "News third")));
}
}
上述代码运行后,我最终得到包含3个节点的newsList
,其中node.Previous
和node.Next
都是null
。我做错了什么?
=========================================我的实际代码=== ======================
public ActionResult NewsDetail(int id = 0)
{
var an = db.News
.Select(n => new NewsView
{
Id = n.Id,
Name = n.Name,
Description = n.Description,
IsTop = n.IsTop,
IsDraft = n.IsDraft,
Content = n.Content,
CaruselContentType = n.CaruselContentType,
CaruselFileContent = n.CaruselFileContent,
CaruselFileName = n.CaruselFileName,
CaruselFileSize = n.CaruselFileSize,
NewsPartViews = n.NewsParts
.Select(
np => new NewsPartView
{
Id = np.Id,
SortNumber = np.SortNumber,
IsDraft = np.IsDraft,
Content = np.Content,
NewsId = np.NewsId,
NewsPartImagesPosition = np.NewsPartImagesPosition,
ImagesCols = np.ImagesCols,
ImagesWidth = np.ImagesWidth,
ImagesHeight = np.ImagesHeight,
ImagesBorder = np.ImagesBorder,
ImagesClickEnlarge = np.ImagesClickEnlarge,
NewsPartImageViews = np.NewsPartImages
.Select(
npi => new NewsPartImageView
{
Id = npi.Id
}
)
}
)
});
var newslList = new LinkedList<NewsView>(an);
return View(newslList.Find(newslList.First(view => view.Id == id)));
}
答案 0 :(得分:5)
你不应该有LinkedList<LinkedListNode<News>>
。您应该使用LinkedList<News>
。 LinkedList
隐含地将每个元素包装在它自己的LinkedListNode
中。你发生的事情是,有一堆LinkedListNode<LinkedListNode<News>>
个对象,外部节点的Next
/ Previous
都设置得恰当,但你的内部节点都有null
对于Next
/ Previous
属性。
以下是创建LinkedList
。
var newsList = new LinkedList<News>();
newsList.AddLast(new News(1,"News first"));
newsList.AddLast(new News(2, "News second"));
newsList.AddLast(new News(3, "News third"));
另请注意,LinkedList
通常不是最佳的数据结构;它很少比其他类型的收藏更好。根据您正在使用的内容,您最好使用List
,Stack
,Queue
。
答案 1 :(得分:1)
使用链表时,类型T不需要是所需类型的LinkedListNode。您可以直接使用所需的类型。
var newsList = new LinkedList<News>();
newsList.AddLast(new LinkedListNode<News>(new News(1, "News first")));
newsList.AddLast(new LinkedListNode<News>(new News(2, "News second")));
newsList.AddLast(new LinkedListNode<News>(new News(3, "News third")));
这将按照您想要的方式设置您的链接列表。
答案 2 :(得分:1)
如果您尝试将所有三个项目添加到列表中,请使用此
var newsItems = new News[] {
new News(1,"News first"),
new News(2, "News second"),
new News(3, "News third")};
var newsList = new LinkedList<News>(newsItems);
答案 3 :(得分:0)
在我看来,您的LinkedListNode对象每个只有一个项目;根据MSDN文档,
LinkedListNode.Previous属性:对LinkedList中前一个节点的引用,或null ,如果当前节点是LinkedList的第一个元素(第一个)。
LinkedListNode.Next属性:对LinkedList中下一个节点的引用,或null ,如果当前节点是LinkedList的最后一个元素(Last)。
如果只有一个元素,它既是第一个也是最后一个 - 因此你会得到两个方法的NULL结果。