【问题标题】:Give console input for List of objects in C#为 C# 中的对象列表提供控制台输入
【发布时间】:2020-08-05 00:08:06
【问题描述】:

我想要一个程序将有关人员的信息写入 C# 中的文件...所以我有以下类

class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

    }

写入文件的类是这个:

       class Adding
     {
        public static void AddedPersons(List<Person> persons,string path)
        {
            List<string> content = new List<string>();
            
            content.Add("FirstName , LastName");

            foreach (var person in persons)
            {
                content.Add($"{person.FirstName}, {person.LastName}");
            }

            System.IO.File.WriteAllLines(path,content);
        }
    }

还有主要的方法……

static void Main(string[] args)
        {
           
            List<Person> persons = new List<Person>();

           
            string path = @"C:\Users\cosmi\Desktop\Citire\Test.csv";
            
            Elements(persons);
            Adding.AddedPersons(persons, path);
            
            Console.ReadLine();

        }

并且我在列表中添加的元素在以下方法中被硬编码...

 public static void Elements(List<Person> persons)
        {

            persons.Add(new Person() { FirstName = "Cosmin", LastName = "Ionut" });
            persons.Add(new Person() { FirstName = "Bianca", LastName = "Elena" });
    
        }

所以我想要的是能够将这些人添加为控制台输入,而不是在方法中硬编码

【问题讨论】:

  • 基本上,您可以将 CSV 中的名字和姓氏读入变量,然后将这些变量替换为“Cosmin”和“Ionut”,而不是 new Person() { FirstName = "Cosmin", LastName = "Ionut" });
  • @RobertHarvey,我不这么认为。我知道他想用对Console.ReadLine() 的一些调用来替换Elements 中的代码。因此,Cosmin,您需要定义用户输入该信息的方式。两个单词用空格隔开?或者名字和姓氏分开?输入如何完成?经典的“空空如也”?
  • @Andrew 我试图在'while'循环中分别阅读它们,类似于 Person.FirstName=Console.Readline();但是当我想到一个可以停止而不是永远继续的想法时,我被卡住了
  • 通常你会以一个空条目结束,否则你可以在每次输入 Y/N 问题时询问是否输入新条目。

标签: c# list generics


【解决方案1】:

如果你想要更小的变化,我会这样做:

public static List<Person> GetElements()
{
    List<Person> persons = new List<Person>();
    do
    {
        var person = new Person();

        Console.Write("Enter first name: ");
        person.FirstName = Console.ReadLine();
        Console.Write("Enter last name: ");
        person.LastName = Console.ReadLine();
        persons.Add(person);

        Console.Write("Press Y to enter another person, other key to finish.");
    } while (Console.ReadKey().Key == ConsoleKey.Y);

    return persons;
}

代码非常简单。我不会在Main 中创建列表,而是让此方法创建并填充列表,因此与创建列表相关的所有操作都在一个地方。此外,方法通常是动词,以清楚地说明它们的作用。使用void Elements(List&lt;Person&gt;),你根本猜不到它的作用。

【讨论】:

  • 非常感谢!这就是我首先要寻找的,让用户在按下按钮时停止操作,但我无法找出错误,所以我放弃了这个想法。再次感谢!
【解决方案2】:

一个想法是编写一个方法,从控制台输入中获取名字和姓氏并返回一个新的Person 对象。下面我将它作为static 方法添加到Person 类中。

我还添加了一个名为 AsCsvItem 的实例方法,它以 CSV 格式 ("FirstName, LastName") 返回人员,稍后会派上用场。

最后我添加了一个staticSaveToFile 方法,它将人员列表以Csv 格式保存到指定的文件路径。

请注意,这些新方法可能存在于其他地方,为方便起见,我只是将它们放在 Person 类中:

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public static Person FromConsoleInput()
    {
        var person = new Person();

        Console.Write("Enter first name: ");
        person.FirstName = Console.ReadLine();

        Console.Write("Enter last name: ");
        person.LastName = Console.ReadLine();

        return person;
    }

    public string AsCsvItem()
    {
        return $"{FirstName} , {LastName}";
    }

    public static void SaveToFile(List<Person> people, string path)
    {
        // Create a list with the column headers
        List<string> content = new List<string> {"FirstName , LastName"};

        // Add a line for each person
        content.AddRange(people.Select(person => person.AsCsvItem()));

        // Save it to the file path
        File.WriteAllLines(path, content);
    }
}

然后您可以在循环中调用FromConsoleInput 方法来填充人员列表,并使用SaveToFile 方法将他们保存到csv 文件中。下面我使用numPeople 来确定我们应该添加多少人:

var numPeople = 2;
var people = new List<Person>();

for (var i = 0; i < numPeople; i++)
{
    Console.WriteLine($"Enter person #{i + 1} info:");
    people.Add(Person.FromConsoleInput());
}

Person.SaveToFile(people, @"c:\temp\people.csv");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多