Как правильно отобразить пару ‹строка, объект›

Итак, я проходил онлайн-курс C# в классе, посвященном IDictionary, где они сделали это (для тестирования пар, содержащих строку и экземпляр класса):

    public static void Main(string[] args)
    {

        IDictionary<string, Student> Students = new Dictionary<string, Student>();

        Students.Add("Ex1", new Student("Example 1", 34672 ));
        Students.Add("Ex2", new Student("Example 2", 8787));

        foreach (var item in Students)
        {
            Console.WriteLine(item);
        }
        Console.ReadKey();
    }

    public class Student
    {
        public string v1 { get; set; }
        public int v2 { get; set; }

        public Student (string v1, int v2)
        {
            this.v1 = v1;
            this.v2 = v2;
        }

    }

Он должен отображать содержимое пары

[Ex1, {Example 1, 34672}]

но вместо этого он показывает мне:

[Ex1, ConsoleApp1.Program+Student]

Это прямая копия из видео, поэтому я подумал, что это могут быть какие-то отличия в версии .NET framework, но нет. Просто направился к SO, чтобы посмотреть, не схожу ли я с ума. Я мог бы получить значения, используя item.Value.v1, но это потребовало бы слишком много работы с реальными экземплярами, так как мне пришлось бы перебирать все значения внутри этого объекта.


person alfablac    schedule 06.06.2018    source источник
comment
Вы можете переопределить .ToString() в классе Student. В противном случае строковым представлением объекта по умолчанию является его имя класса.   -  person David    schedule 06.06.2018
comment
Спасибо, Дэвид. Я знал, что что-то не складывается. Инструктор компилировал и получал правильное отображение без каких-либо переопределений. Хотел бы я отметить ваш комментарий как ответ, так как вы первый, кто предоставил это решение (которое работает).   -  person alfablac    schedule 06.06.2018
comment
Ответ Себастьяна должен быть помечен как ответ, так как он был первым, кто ответил ответом, а не комментарием. Довольно понятная система на самом деле.   -  person ataraxia    schedule 06.06.2018
comment
Ага. Я знаю, как работает система, но тем не менее... Дэвид ДЕЙСТВИТЕЛЬНО дал ответ за 2 минуты до Себастьяна. Он просто не опубликовал никакого кода. Я просто благодарил его за то, что он был первым. Между прочим, я мог бы просто выбрать ваш или Rawita, поскольку вы все предоставили не только код, но и причину, стоящую за ним. Итак, спасибо всем.   -  person alfablac    schedule 06.06.2018


Ответы (4)


Вы можете переопределить метод ToString() в классе Student.

public override string ToString()
{
    return "{" + v1 + "," + v2 + "}";
}
person Sebastian Kilb    schedule 06.06.2018

В вашем классе Student вам нужно добавить переопределение для метода ToString(), так как в настоящее время он возвращает base.ToString(), который является именем самого объекта, а не объектов, содержащихся в нем (string v1 и int v2).

Добавьте это в свой класс Student:

public override string ToString()
{
     return "{" + v1 + "," + v2.ToString() + "}";
}
person ataraxia    schedule 06.06.2018

По сути, object.ToString() возвращает тип. Если вы хотите что-то другое, вы можете переопределить метод ToString()

Это реализация ToString() в классе object;

public virtual String ToString()
{
    return GetType().ToString();
}

Поэтому измените свой код на

public class Student
{
    public string v1 { get; set; }
    public int v2 { get; set; }
    public Student(string v1, int v2)
    {
        this.v1 = v1;
        this.v2 = v2;
    }
    public override string ToString()
    {
        return $"{{{v1}, {v2}}}";
    }
}
person Rawitas Krungkaew    schedule 06.06.2018

попробуйте отобразить item.key и item.value отдельно

person Rajeev Boobna    schedule 06.06.2018
comment
В его классе Student нет свойств key и value, но есть свойства v1 и v2. - person Cid; 06.06.2018