C # распечатать список предметов для объекта с 3 свойствами - PullRequest
0 голосов
/ 06 декабря 2018

Я новичок в C #

Текущий код

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

namespace Basic1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Employee> empList = new List<Employee>()
            {
                new Employee { FName = "Bill", LName = "Lucas", Id = 101 },
                new Employee { FName = "Steve", LName = "Lanes", Id = 102 },
                new Employee { FName = "Jeff", LName = "Clark", Id = 103 },
                new Employee { FName = "Joe", LName = "Thomas", Id = 104 },
                new Employee { FName = "Joe", LName = "Wang", Id = 105 },
                new Employee { FName = "Steven", LName = "Holmes", Id = 106 },
                new Employee { FName = "Mark", LName = "Lark", Id = 107 },
                new Employee { FName = "Larry", LName = "Good", Id = 108 },
                new Employee { FName = "Tim", LName = "Whiles", Id = 109 },
                new Employee { FName = "Jerry", LName = "Lee", Id = 110 }
            };
            List<Employee> empListJoe = new List<Employee>();
            foreach (Employee employee in empList)
            {
                if (employee.FName == "Joe")
                {
                    empListJoe.Add(employee);
                }
            }
            Console.WriteLine(empListJoe);
            Console.ReadLine();
        }
    }
    public class Employee
    {
        public string FName { get; set; }
        public string LName { get; set; }
        public int Id { get; set; }
    }
}

Итак, я создал новый список со всеми сотрудниками с именем "Joe".
Однако, похоже,Я не могу распечатать список элементов должным образом, вместо этого я получаю вывод, подобный этому:

'System.Collections.Generic.List`1 [Basic1.Employee]

или просто две строки

Basic1.Employee.

Я пробовал все это, но все равно получаю общий вывод, а не фактический список элементов.

Console.WriteLine(empListJoe);

Console.WriteLine(String.Join(" \n", empListJoe));

empListJoe.ForEach(Console.WriteLine);

Console.WriteLine(empListJoe.ToString());

Кстати, этот работает:

Console.WriteLine($"Employee Name: {employee.FName} {employee.LName}, Employee ID: {employee.Id}");

Но я пытаюсь распечатать из нового списка.Я предполагаю, что упускаю что-то простое.

Спасибо.

Ответы [ 4 ]

0 голосов
/ 06 декабря 2018

Я думаю, вам следует задать себе два вопроса:

  1. Знает ли C #, как вы хотите, чтобы список печатался?
  2. Знает ли C #, как вы хотите печатать каждый из них?элемент из вашего списка?

Ответ на оба вопроса - просто НЕТ.

C # знает только то, что у каждого объекта есть метод ToString (), который можно переопределить.Он вызывает его, когда вы непосредственно пытаетесь напечатать список и видите вывод по умолчанию.

Вы должны написать код, чтобы напечатать только один элемент (записать функцию / метод).Затем вам нужно вручную вызвать этот код (функцию / метод) для каждого элемента в вашем списке, чтобы напечатать его - цикл foreach подойдет.

Если вы знакомы с ООП, то вы можете просто переопределить метод ToString для вашегопользовательский класс.

0 голосов
/ 06 декабря 2018
     List<Employee> empListJoe = new List<Employee>();
     foreach (Employee employee in empList)
     {
        if (employee.FName == "Joe")
        {
           empListJoe.Add(employee);
        }
     }
     foreach (Employee employeee in empListJoe)
     {
        Console.WriteLine($"{employeee.FName} {employeee.LName}");
     }
     Console.ReadLine();

Или вы можете просто использовать первый цикл, поместить строку Console.WriteLine ... под empListJoe.Add (employee);линия.

0 голосов
/ 06 декабря 2018

Переопределите метод ToString() в типе вашего сотрудника:

public class Employee
{
    public string FName { get; set; }
    public string LName { get; set; }
    public int Id { get; set; }

    public overrides string ToString()
    {
        return $"Name: {FName} {LName}, Id: {Id}";
    }
}

.Net не знает, как преобразовать ваш случайный тип в строку, но переопределение метода ToString() даст емулучше по умолчанию, когда больше ничего не доступно.

Получив это, вы также должны понимать, что .Net не будет автоматически преобразовывать коллекции в строки.Вы должны сами выполнить итерацию коллекции и вывести строковое значение для каждого элемента.Есть множество способов сделать это, включая базовые циклы for или foreach и метод string.Join.

0 голосов
/ 06 декабря 2018

Все это:

Console.WriteLine(empListJoe);
Console.WriteLine(String.Join(" \n", empListJoe));
empListJoe.ForEach(Console.WriteLine);
Console.WriteLine(empListJoe.ToString());

используйте косвенно или явно ToString метод вашего класса.Поскольку вы не изменили его, вы получите непредвиденные ошибки (реализация класса по умолчанию возвращает имя класса).Вы можете переопределить этот метод в своем классе, например так:

public override string ToString()
{
    return $"{FName} {LName}";
}

После этого вам лучше всего отобразить ваш список:

Console.WriteLine(String.Join(" \n", empListJoe));

В качестве альтернативы вы можете использовать метод LINQ Select чтобы получить список строк в нужном вам формате, например:

Console.WriteLine(String.Join(" \n", empListJoe.Select(e => $"{e.FName} {e.LName}")).ToArray());

Вы также можете использовать метод LINQ для фильтрации сотрудников по имени.Если сложить все это вместе, рабочий код может быть:

var empListJoe = empList
  .Where(e => e.FName = "Joe")
  .Select(e => $"{e.FName} {e.LName}"))
  .ToArray();
Console.WriteLine(String.Join(" \n", empListJoe));
...