List输出名称空间的名称,而不是其值

时间:2018-02-11 20:07:30

标签: c# list class

所以,首先,我是一个初学者,这个问题必须非常简单,但我只是找不到它。所以问题是,我有一个小的txt,包含水果及其数量:

Apple 26
Banana 55
Pear 12
Orange 32
Watermelon 81
Grapefruit 30

我在列表中添加这些值,但它输出(在我看来)名称空间的名称。我想这是一些"属性访问"问题,但我不知道如何解决它。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace practice
{
    class Fruits
    {

        string fruit { get; set; }
        int amount { get; set; }

        public Fruits(string a, int b)
        {
            fruit = a;
            amount = b;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Fruits> data = new List<Fruits>();
            StreamReader str_R = new StreamReader("list.txt");
            while (!str_R.EndOfStream)
            {
                String[] line = str_R.ReadLine().Split(' ');
                data.Add(new Fruits(line[0], Convert.ToInt32(line[1])));

            }

            foreach (var x in data)
            {
                Console.WriteLine(x);
            }

            Console.ReadKey();

        }
    }
}

输出:

practice.Fruits
practice.Fruits
practice.Fruits
practice.Fruits
practice.Fruits
practice.Fruits

我想将列表的实际值作为输出。

2 个答案:

答案 0 :(得分:4)

Fruits类的基类是Object类,默认情况下,当您调用类的实例时,它将返回ToString()方法。< br />对象的ToString()方法返回此对象的类型(命名空间)。
ToString()方法是Virtual(可以被任何继承它的类覆盖)所以你可以覆盖它:

class Fruits
{

    string fruit { get; set; }
    int amount { get; set; }

    public Fruits(string a, int b)
    {
        fruit = a;
        amount = b;
    }

    public override string ToString()
    {
        return string.Format("Fruit: {0} Ammount: {1}", fruit, amount);
    }
}

此外,您始终可以这样做:

foreach (var x in data)
{
    Console.WriteLine(string.Format("Fruit: {0} Ammount: {1}", x.fruit, x.amount));
}

答案 1 :(得分:0)

这是正常行为。如果给出除String之外的任何东西,Console.WriteLine()将在其上调用ToString()。

Object.ToString()将只输出类名,除非它被覆盖。

您需要覆盖Fruit的ToString():

var toDeleteItem = new Set(['zed']);
arr3 = arr3.filter(
    // Strings are compared
    obj => !toDeleteItem.has(obj.username)
);

或明确指出x.fruit和x.amount。

public override string ToString(){
  return fruit;
}