所以,首先,我是一个初学者,这个问题必须非常简单,但我只是找不到它。所以问题是,我有一个小的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
我想将列表的实际值作为输出。
答案 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;
}