如何通过linkedlist正确显示我的对象(如果它有一些参数)

本文关键字:如果 参数 对象 linkedlist 何通过 我的 显示 | 更新日期: 2023-09-27 18:20:40

我是C#的新手,我需要一些关于我的任务的帮助。首先,我必须显示一个链表,其中包含一个名为Parcel的对象和那个Parcel包含几个参数int idstring nameint weight。当试图调用一个函数来显示linkedlist中的任何内容时,我得到了一个错误。

这是我的DisplayInventory()函数:

public void DisplayInventory()
    {
        for (Node j = head; j != null; j = j.Link )
        {
           Console.WriteLine(j.Data);
        }
    }

这是我的包裹等级:

class Parcel
    private int id;
    private String customerName;
    private int weight;
    public Parcel(int id, String customerName, int weight) 
    {
        this.id = id;
        this.customerName = customerName;
        this.weight = weight;
    }
    public int ID
    {
        get { return id; }
        set { id = value; }
    }
    public String CustomerName
    {
        get { return customerName; }
        set { customerName = value; }
    }
    public int Weight 
    {
        get { return weight; }
        set { weight = value; }
    }
}

这是我的节点类:

class Node
{
    private object data;
    public object Data
    {
        get { return data; }
        set { data = value; }
    }
    private Node link;
    internal Node Link
    {
        get { return link; }
        set { link = value; }
    }
    public Node(object d)
    {
        this.data = d;
    }
}

除了在linkedlist.cs中找到的DisplayInventory()函数外,一切都很好。当我试图打印它时,它只显示了AppName.Parcel,我知道我必须转换我的j.data,但它对我不起作用,有什么帮助吗?非常感谢。

如何通过linkedlist正确显示我的对象(如果它有一些参数)

您应该打印每个属性:

Console.WriteLine("Id: " + j.Data.Id.ToString());
Console.WriteLine("Name: " + j.Data.Name);

等等。

您可以为Parcel类的每个字段/属性调用Console.WriteLine(),或者覆盖它的ToString()方法。看起来是这样的:

public class Parcel()
{
    public override string ToString()
    {  
         string str =  ....// create here your string representation of Parcel
         // if number of fileds is quite big use StringBuilder class
         return str;
    }
}

Console.WriteLine将在j.Data对象上调用object.ToString(),默认情况下只返回类型名称(Parcel)。

我假设DisplayInventory在实现链表的类中——在这种情况下,您应该能够直接引用类的属性:

例如

Console.WriteLine(j.Id);

您也可以通过将j(Parcel)添加到源中来覆盖ToString

public override string ToString() { return this.Id.ToString(); }

编辑:

好的,根据您的更新,您可以将Node.Data(j.Data)投射到Parcel并直接访问成员:

for (Node j = head; j != null; j = j.Link )
{
    // Cast using the as keyword - if the cast fails, parcel will be null, otherwise it will be the casted object
    var parcel = j.Data as Parcel;
    // Check if parcel is null, if not write some info
    if(parcel != null)
    {
        Console.WriteLine(parcel.Id);
        Console.WriteLine(parcel.CustomerName);  // etc
    }
}

或者,只需使用j.Data.ToString(),并确保您已覆盖ParcelToString成员

例如在Parcel.cs

// Override the ToString method. If you are using Visual Studio you should get a popup
// telling you which methods you can override after you type override then hit space
public override string ToString() 
{
    // string.format is one way of formatting the data, the tokens are replaced by the indexed arguments
    return string.Format("{0} - {1}", Id, CustomerName);
}