2016-02-01 4 views
-2

Почему я получаю вывод своего пространства namespace.object при печати из словаря?Неверный вывод из словаря в C#

Это мой объект данных.

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

вам нужно переопределить 'ToString'. –

+1

Строковое представление объекта по умолчанию - это имя типа этого объекта. .NET не имеет способа узнать, как вы лично представляете, что ваш объект должен быть напечатан. Вы должны сказать это, переопределив '.ToString()' на этом объекте. – David

ответ

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); 
    } 
} 
+0

Благодарим вас за отзыв об именах .NET. Я пытаюсь усовершенствовать свои методы. –

+0

Тогда я предлагаю вам взглянуть на: https://msdn.microsoft.com/en-us/library/ms229002.aspx –

2

Для начала кто-то, кто проголосовал за этот вопрос, должен быть расстрелян. Это фантастический вопрос.

Ответ заключается в том, что вы подразумеваете в инструкции Console.WriteLine(). Этот метод принимает строку. Этот метод выводится из элементов [1], что означает «элементы [1] .ToString()». Поскольку вы не переопределили метод object.ToString(), вывод по умолчанию - это то, что вы получаете - довольно бессмысленное пространство имен и имя объекта.

На эту проблему действительно два ответа. Как и было предложено, вы можете обеспечить переопределение внутри вашего объекта, чтобы дать ему выход по умолчанию. Другой вариант должен быть более конкретным, что вы послали к Console.WriteLine(), например:

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

консольный вывод будет выглядеть следующим образом:

водорода (H)

+0

Upvote для отличного примера для альтернативного решения! –

+0

Спасибо, я рад узнать все возможные методы !. –

+2

Console.WriteLine имеет перегрузку для форматирования строк, просто чтобы вы знали. –

Смежные вопросы