添加到LinkedList后的LinkedListNode不设置next和previous字段

时间:2012-12-27 19:01:57

标签: c#

我是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.Previousnode.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)));
        }

4 个答案:

答案 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通常不是最佳的数据结构;它很少比其他类型的收藏更好。根据您正在使用的内容,您最好使用ListStackQueue

答案 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结果。