1

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

这是我的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,但它对我不起作用,有什么帮助吗?非常感谢。

4

3 回答 3

1

您应该打印每个属性:

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

等等。

于 2013-07-01T16:37:30.267 回答
1

Console.WriteLine将调用object.ToString()您的j.Data对象,默认情况下该对象仅返回类型名称(包裹)。

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

例如

Console.WriteLine(j.Id);

您还可以通过将其添加到源中来覆盖ToString任何(包裹):j

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()并确保您已覆盖该ToString成员Parcel

例如在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);
}
于 2013-07-01T16:39:40.553 回答
1

您可以调用类Console.WriteLine()的每个字段/属性Parcel或覆盖它的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;
    }
}
于 2013-07-01T16:39:57.900 回答