C#中字典输出错误

时间:2016-02-01 17:58:56

标签: c# dictionary

为什么从字典打印时会得到namespace.object的输出?

这是我的数据对象。

namespace MoleCalculator
{
    public class elementDO
    {
        public int AtomicNumber { get; set; }
        public string Symbol { get; set; }
        public string Name { get; set; }
        public decimal AtomicWeight { get; set; }
    }
}

这是包含我的词典的类

namespace MoleCalculator
{
public class elementDictionary
{
    public Dictionary<int, elementDO> periodic_Table = new Dictionary<int, elementDO>()
    {
        {1,new elementDO{AtomicNumber = 1,Symbol = "H",Name = "Hydrogen", AtomicWeight = 1.007825M}},

这就是驱动它的原因

var elements = new elementDictionary().periodic_Table;
        Console.WriteLine(elements[1]);

3 个答案:

答案 0 :(得分:7)

您需要覆盖ToString,因为默认实现只返回命名空间和类名。我已经为您提供了一个如何在此处覆盖ToString的示例:

public class elementDO
{
    public int AtomicNumber { get; set; }
    public string Symbol { get; set; }
    public string Name { get; set; }
    public decimal AtomicWeight { get; set; }

    public override string ToString()
    {
        return $"AtomicNumber: {AtomicNumber}. Symbol: {Symbol}. Name: {Name}. AtomicWeight: {AtomicNumber}";
    }
}

您的代码与上述ToString的实现一起将提供输出:

AtomicNumber: 1. Symbol: H. Name: Hydrogen. AtomicWeight: 1

答案 1 :(得分:2)

根据评论建议,当您创建自定义类时,应覆盖默认的ToString()方法。

// I would change the class name to ElementDO in order to be consist with .NET Naming Conventions
public class elementDO
{
    public int AtomicNumber { get; set; }
    public string Symbol { get; set; }
    public string Name { get; set; }
    public decimal AtomicWeight { get; set; }

    public override string ToString()
    {
        return string.Format("{0}:{1}:{2}:{3}", AtomicNumber, Symbol, AtomicWeight, Name);
    }
}

答案 2 :(得分:2)

对于初学者来说,投票支持这个问题的人应该被枪杀。这是一个很棒的问题。

答案在于您从Console.WriteLine()语句中暗示的内容。这个方法需要一个字符串。该方法从元素[1]推断出平均值[1] .ToString()&#34;。由于您没有覆盖object.ToString()方法,因此您可以获得默认输出 - 一个相当无意义的命名空间和对象名称。

这个问题确实有两个答案。如建议的那样,您可以在对象中提供覆盖以为其提供默认输出。另一个选项是更具体地发送给Console.WriteLine()的内容,例如:

Console.WriteLine(string.Format("{0} ({1}), elements[1].Name, elements[1].Symbol));

控制台输出如下所示:

  

氢(H)