【问题标题】:How to call a method multiple times at once for a file如何一次为文件多次调用方法
【发布时间】:2021-02-21 02:48:30
【问题描述】:

我有一个 Person 模型类如下;

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

我从用户那里得到 FirstName 和 LastName 并验证它们。然后我使用以下方法为用户输入的每个名字和姓氏创建一个用户名;

public static string CreateUserName(Person person)
{
    return $"{person.LastName}{person.FirstName.Substring(0,2)}";
}

通过每次手动运行程序,我可以一次完成一个人。我想知道如何做的是,假设我在一个 CSV 文件中存储了多行数据,该文件由 FirstName 和 LastName 组成,我读取了该文件,然后使用我的 CreateUserName 一次为该文件中的每一行生成一个用户名方法。

输出将打印在控制台上,Person 类也将用于其他操作。

【问题讨论】:

  • IEnumerable<string> CreateUserNames(IList<Person> people) { return people.Select(p => CreateUserName(p)); }?
  • 使用 foreach(string line in File.ReadLines(...)) 读取文件,line.Split(',') 作为拆分 CSV 数据的简单方法,从您的拆分位中创建一个 Person,调用您的方法
  • 您要输出文件还是控制台?请具体说明您希望该程序如何工作。此外,如果Person 将用于其他任何事情,或者在计算用户名时程序是否结束?以上所有都有助于程序的设计。
  • 问题已更新。

标签: c#


【解决方案1】:

CSV 内容:

FirstName;LastName
FirstName1;LastName1
FirstName2;LastName2
FirstName3;LastName3

代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

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

    class Program
    {
        public static string CreateUserName(Person person) =>
            $"{person.LastName}{person.FirstName.Substring(0, 2)}";
            
        static void Main(string[] args)
        {
            var lines = File.ReadAllLines("test.csv");

            var result = lines.Skip(1)
                .Aggregate(new Dictionary<string, Person>(), (dict, x) =>
                {
                    var items = x.Split(';');

                    var person = new Person { FirstName = items[0], LastName = items[1] };

                    if (!dict.TryAdd(CreateUserName(person), person))
                        throw new Exception("User with such username already exists!");

                    return dict;
                });

            foreach (var item in result)
            {
                Console.WriteLine($"Username: '{item.Key}' for {item.Value.FirstName} {item.Value.LastName}");
            }
        }
    }
}

结果:

Username: 'LastName1Fi' for FirstName1 LastName1
Username: 'LastName2Fi' for FirstName2 LastName2
Username: 'LastName3Fi' for FirstName3 LastName3

【讨论】:

    【解决方案2】:

    考虑以下演示代码:

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserName 
            // Calculate UserName from first and last
            => $"{LastName}{FirstName.Substring(0, 2)}";
    
        public static Person Parse(string csvLine)
        // Transform a text line "First, Last" into
        // an object of Person
        {
            var parts = csvLine.Split(',');
            if (parts.Length>=2)
            {
                return new Person()
                {
                    FirstName = parts[0].Trim(),
                    LastName = parts[1].Trim()
                };
            }
            throw new ArgumentException(nameof(csvLine));
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var csv = @"First,Last
    Jack, Mas
    Jake, Moon
    John, Mira
    Jonas, Master
    Jacob, Meek
    Josselyn, Moore
    Joanna, Milka";
            var fs = new System.IO.StringReader(csv);
            fs.ReadLine(); // eat up first line
            var list = new List<Person>();
            while (fs.Peek()!=-1)
            {
                var person = Person.Parse(fs.ReadLine());
                list.Add(person);
            }
    
            // create a list of usernames, each in a new line
    
            var unames = string.Join(
                Environment.NewLine, 
                list.Select((person) => person.UserName));
    
            Console.WriteLine(unames);
        }
    }
    

    输出

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 2019-12-22
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多