【问题标题】:Using an array to point to an object and printing to the screen?使用数组指向对象并打印到屏幕?
【发布时间】:2013-04-10 11:18:18
【问题描述】:

我在使用数组指向一个对象然后将该对象的内容打印到屏幕时遇到问题。

到目前为止,我的代码是:

 //Card
        Card cardPack = new Card();
        string[] myCard = new string[10];

        //card objects
        Card cardOne = new Card();
        {
            cardPack.name = "Vodka";
            cardPack.percentage = '5';
            cardPack.quality = '6';
            cardPack.quantity = '4';
            cardPack.taste = '3';
        }

据我所知,此代码有效,因为我没有任何类型的错误。

        //Card Array
        myCard[0] = Convert.ToString(cardOne);

然后我用它来指向实际的对象,这又不会出错,所以我认为它工作正常。

            Console.WriteLine(myCard[0]);

这也不会出错,但是当我尝试运行程序时,我得到的唯一输出是

   "Card"

我很困惑! 你能帮我么?谢谢!

【问题讨论】:

  • Convert.ToString() 只是获取对象类型名称。如果您想获得的不仅仅是类型名称,您需要覆盖 Card 类上的 ToString - .NET 框架子类对象和对象中的所有类型都包含一个 ToString() 虚拟方法
  • 我该怎么做?抱歉,我很久没有这样做了?
  • 你想做什么?只是获取一张卡片的名称,还是调用一个返回整张卡片描述的方法? (这将是 Card 中覆盖的 ToString()
  • @Kjartan 我想输出 cardOne 对象中存在的所有内容,所以我希望输出为:Vodka 5 6 4 3
  • 那么我的猜测是正确的 :) - 只需将整个对象存储在数组中(类型为 Card),然后在该类中调用覆盖的 ToString()

标签: c# arrays object pointers


【解决方案1】:

您需要重写 ToString() 方法才能执行此操作。

请参阅以下代码作为示例:

public override string ToString()
{
    string stringForm = string.Format("{0},{1},{2},{3},{4}", name,percentage, quality, quantity, taste);
    return stringForm;
}

【讨论】:

  • 这对我来说听起来更像是 OP 想要的,我从这个问题中得到了一种 PHP 的感觉(比如 PHP 中的 array_print 可能吗?)。虽然要更正这篇文章,但可以将对象转换为字符串 - CLR 只需在有问题的对象上调用 ToString()
【解决方案2】:

您正在创建一个对象并将其转换为字符串,而不是使用名称。这导致输出对象类型的名称,即“卡片”。

试试这个:

//Card Array
myCard[0] = cardOne.name;

最好是改变你的数组:

//string[] myCard = new string[10];
Card[] myCard = new Card[10];
myCard[0] = cardOne;
Console.WriteLine(myCard[0].name);

当然,您可以覆盖 ToString() 方法,但我猜这不是您想要的。

编辑:阅读您对首选输出的评论后,此代码可能会按照您的意愿执行:

Console.WriteLine("Name: " + myCard[0].name);
Console.WriteLine("Percentage: " + myCard[0].percentage);
Console.WriteLine("Quality: " + myCard[0].quality);
Console.WriteLine("Quantity: " + myCard[0].quantity);
Console.WriteLine("Taste: " + myCard[0].taste);
Console.WriteLine("");

或者如你所说:

Console.Write("myCard[0].name);
Console.Write(" " + myCard[0].percentage);
Console.Write(" " + myCard[0].quality);
Console.Write(" " + myCard[0].quantity);
Console.Write(" " + myCard[0].taste);
Console.WriteLine(""); 

请注意,这仅在您使用 Card[] myCard = new Card[10]; 将数组转换为卡片数组时有效(考虑将名称从“myCard”更改为“allCards”或类似名称。

【讨论】:

  • 这就是我要找的!抱歉,我没有很好地解释自己,唯一的问题是它输出的不是伏特加、5..等,而是输出 space 0, 0, 0, 0?
  • 你也可以试试Console.Write(..),而不是WriteLine。使用 WriteLine,它会自动转到下一行。让我编辑澄清一下。
  • @ValerieBeighton 我已经编辑了我的答案,试试看是否符合您的需要。
  • 这太完美了!非常感谢!这让我发疯了好几个小时!!谢谢您的帮助! :)
  • @ValerieBeighton 如果您认为有用,请考虑接受答案。
【解决方案3】:

重写 Card 类的 ToString 方法。

 public class Card
 {
    public string Name { get; set; }
    public override string ToString()
    {
         return string.Format("CardName: {0}", Name);
    }
 }

之后,您可以将 Card 对象存储在 Card 数组中,WriteLine 将在控制台上显示正确的值(在 ToString() 中设置)。

Card[] myCard = new Card[10];

Card cardOne = new Card();
cardOne.name = ...

 myCard[0] = cardOne;
 Console.WriteLine(myCard[0]);

【讨论】:

    【解决方案4】:

    Covert.ToString 将 CardOne 对象转换为字符串。这意味着转换类名。你应该在你的类中转换一个明确的对象。

    • 编辑 Joetjah 刚刚向您展示了我的意思。

    【讨论】:

      【解决方案5】:

      您得到的输出是您存储在 cardOne 中的 Object 的名称,即“Card”对象。

      如果你想要的是“伏特加”,你的代码应该类似于:

      //Card Array
      myCard[0] = Convert.ToString(cardOne.name);
      

      由于 name 已经是一个字符串,您可以将其简化为:

      //Card Array
      myCard[0] = cardOne.name;
      

      【讨论】:

        【解决方案6】:

        您不能按原样打印对象。

        Console.WriteLine(myCard[0]); 打印对象的类型,这就是它返回 "Card" 的原因。

        所以你必须访问对象的每个成员然后打印它。

        所以要获得会员,您必须使用mycard[index].<member name> 例如:mycard[0].name

        希望对你有所帮助,否则请告诉我。

        【讨论】:

        • myCard 是一个字符串数组,所以应该没问题
        • @David S:如果你打印一个对象,它仍然返回类型
        • 是的,但我只是说myCard 不包含Card 对象。 (也许应该,但那是另一回事)
        【解决方案7】:

        你可能想要的是:

        Card[] myCard = new Card[10];
        
        (...)
        
        myCard[0] = cardOne;
        

        然后这个:

        Console.WriteLine(myCard[0].ToString());
        

        ...将输出调用Card类型/类的ToString()-方法的结果。

        我假设这就是你想要的?

        更新;将这样的内容添加到您的 Card 课程中

            public override string ToString()
            {
                return name + " " 
                       + percentage + " "  
                       + quality + " "  
                       + quantity + " "  
                       + taste + " " );
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-02
          • 1970-01-01
          • 1970-01-01
          • 2011-03-09
          • 1970-01-01
          相关资源
          最近更新 更多