【问题标题】:Reading from CSV file and "save" it's contents to List objects and load them in Program.cs从 CSV 文件中读取并将其内容“保存”到 List 对象并将它们加载到 Program.cs
【发布时间】:2020-08-15 22:14:29
【问题描述】:

我的小型控制台应用程序的目标是读取 CSV 文件并将其内容保存在列表中(有效)。我有一个使用这种方法的单独课程。请参阅 UserList.cs 中未注释的部分:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Globalization;
using System.Linq;
using CsvHelper;

namespace GimpiesConsoleOOcsvListUI
{
    public class UserList
    {
        // public static List<User> DefaultUsers()
        // {
        //     // First line to skip a row and position all users correctly under the right headers
        //     User user0 = new User("", "", "", "");
        //     // Create user default instances
        //     User user1 = new User("Beheer", "beheer@gimpies.nl", "123", "admin");
        //     User user2 = new User("Inkoop", "inkoop@gimpies.nl", "123", "purchase");
        //     User user3 = new User("Verkoop", "verkoop@gimpies.nl", "123", "sales");
        //     // List of users (with a list you can add, get and remove items in the list)
        //     List<User> users = new List<User>();
        //     users.Add(user0);
        //     users.Add(user1);
        //     users.Add(user2);
        //     users.Add(user3);

        //     // Return all the users in the List to other classes
        //     return users;
        // }

        public void LoadUsersFromCSV(List<User> users)
        {
            // using (var mem = new MemoryStream())
            // using (var writer = new StreamWriter(mem))
            using (var reader = new StreamReader("users.csv"))
            using (var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture))
            {
                try
                {
                    csvReader.Configuration.Delimiter = ";";
                    csvReader.Configuration.IgnoreBlankLines = true;
                    csvReader.Configuration.HasHeaderRecord = true;
                    csvReader.Configuration.PrepareHeaderForMatch = (string header, int index) => header.ToLower();
                    csvReader.Configuration.MissingFieldFound = null;
                    csvReader.Read();
                    csvReader.ReadHeader();
                    
                    // Store all content inside a new List as objetcs
                    var usersfromcsv = csvReader.GetRecords<User>().ToList();  
                    

                    // return users;
                                  
                }
                catch (CsvHelper.HeaderValidationException exception)
                {
                    Console.WriteLine(exception);
                }
                
            }
            
        }
    }
}

在我的 Program.cs 中,我想调用此方法并使用创建的 List 的内容来使用登录代码。所以要检查用户名和密码是否输入正确,用户是否可以登录。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Globalization;
using System.Linq;
using CsvHelper;

namespace GimpiesConsoleOOcsvListUI
{
    class Program
    {
        static void Main(string[] args)
        {
            // List of default users
            // List<User> users = UserList.DefaultUsers();
            
            // Working on it... Try to read csv file first and try to read list from method in UserList.cs
            // UserList ul = new UserList();
            List<User> users = UserList.LoadUsersFromCSV();
            // List<User> users = 
            // ul.LoadUsersFromCSV(users);
        

            // Create login instance
            LoginManager loginMgr = new LoginManager();

            // Create stock instance
            Stock stock = new Stock();

            Start:
            // Welcome message
            Console.WriteLine("Welcome to the Gimpies Console Application! Choose 1 to login or 2 to exit this application:");

            // Get input from user
            string input = Console.ReadLine();

            // Set to false to check if login fails or not
            bool successfull = false;

            while (!successfull)
            {
                if(input == "1")
                {
                    Console.WriteLine("Enter your username:");
                    string username = Console.ReadLine();
                    Console.WriteLine("Enter your password:");
                    string password = Console.ReadLine();

                    foreach (User user in users)
                    {
                        if (username == user.username && password == user.password && user.userrole == "admin")
                            {
                                // Create Admin instance to be able to call methods in that class
                                Admin am = new Admin();
                                // Calling the method in Admin.cs to start Menu logic
                                am.AdminLoggedIn(users); 
                                
                                successfull = true;
                                break; 
                            }

                        if (username == user.username && password == user.password && user.userrole == "purchase")
                            {
                                // Create Purchase instance to be able to call methods in that class
                                Purchase pc = new Purchase();
                                // Calling the method in Purchase.cs to start Menu logic
                                pc.PurchaseLoggedIn(users);
                                
                                successfull = true;
                                break; 
                            }
                        
                        if (username == user.username && password == user.password && user.userrole == "sales")
                            {
                                // Create Sales instance to be able to call methods in that class
                                Sales sl = new Sales();
                                // Calling the method in Sales.cs to start Menu logic
                                sl.SalesLoggedIn(users);
                                
                                successfull = true;
                                break; 
                            }
                    }

                        if (!successfull)
                            {
                                Console.WriteLine("Your username or password is incorrect, try again !!!");
                            }
                }

                else if (input == "2")
                {          
                    Environment.Exit(-1);
                }

                else if (input == "3")
                {
                    FileOperations fo = new FileOperations();
                    // Calling the method from FileOperations.cs to write the List here to a CSV file
                    fo.WriteUsersToCSV(users);
                    goto Start;
                }

                else if (input == "4")
                {
                    FileOperations fo = new FileOperations();
                    // Calling the method from FileOperations.cs to write the List here to a CSV file
                    fo.ReadUsersFromCSV(users);
                    goto Start;
                }

                else
                {
                    Console.WriteLine("Try again !!!");
                    break;
                }
            }
            
            // // Loop over stored users within instances inside the list where users are added
            // foreach (User user in users)
            // {
            
            //     if(loginMgr.Login(user))
            //     {
            //         // Login successfull
            //         Console.WriteLine("Login user " + user.UserName);

            //     }
            //     else
            //     {
            //         // Not successfull

            //     }
            // }  
            
        }
    }
}

我收到此错误:

Program.cs(20,41): error CS7036: There is no argument given that corresponds to the required formal parameter 'users' of 'UserList.LoadUsersFromCSV(List<User>)' [/home/pascalmariany/Projects/Csharp/GimpiesConsoleOOcsvList/GimpiesConsoleOOcsvListUI/GimpiesConsoleOOcsvListUI.csproj]

这是我的 User.cs 及其构造函数:

namespace GimpiesConsoleOOcsvListUI
{
    public class User
    {
        // Constructor
        public User(string username, string email, string password, string userrole)
        {
            _UserName = username;
            _Email = email;
            _Password = password;
            _UserRole = userrole;
        }

        private string _UserName;
        private string _Email;
        private string _Password;
        private string _UserRole;

        public string username
        {
            get { return _UserName; }
            set { _UserName = value; }
        }

        public string email
        {
            get { return _Email; }
            set { _Email = value; }
        }

        public string password
        {
            get { return _Password; }
            set { _Password = value; }
        }

        public string userrole
        {
            get { return _UserRole; }
            set { _UserRole = value; }
        }
        
    }
}

我需要改变什么才能达到我的目标?

【问题讨论】:

  • 不要使用goto
  • 我知道 :-) 我仍然需要改变它。

标签: c# list constructor console-application csvhelper


【解决方案1】:

您已将 LoadUsersFromCsv 方法声明为“获取列表”:

public void LoadUsersFromCSV(List<User> users)

但你试图像“不接受任何东西并返回一个列表”一样使用它

List<User> users = UserList.LoadUsersFromCSV();

编译器抱怨,因为您没有在“用户”参数中提供列表


查看代码,它读取文件并将其转换为列表,但没有返回它,也没有填充给定的列表..

我建议您更改 LoadUsers 方法,使其返回它读取的列表,将其从 void 更改为 List&lt;User&gt; 并删除 users 参数

【讨论】:

  • 我改变了我的方法。由于 cmets 中的字符有限,这不是完整的代码: ; foreach(var user in users) { users.Add(user); } 返回用户; } ` 并且来自 Program.cs: ` List users = UserList.LoadUsersFromCSV(); ` 错误:“并非所有代码路径都返回值”
  • 也许很方便。代码在 GitLab 上:gitlab.com/marianydesign/gimpiesconsoleoocsvlist
  • 并非所有代码路径都返回值意味着 C# 已确定有某种方法可以退出方法而不返回值。如果方法被声明为返回值,则方法的所有方法都必须返回值。例如public string GetDriverLicenseNumber() { if(age &lt; 15) return "Too young to have a license"; } - 如果年龄大于 14,则不会返回任何内容,这是编译器错误。我真的不知道您的代码现在是什么样子,但我假设“类似于问题”(提示:您可以通过微小的更改来编辑您的问题)
  • 因此,这意味着 is 有一条从方法中出来的路径而不返回任何值:假设 try 中的任何代码行,在 return users 之前崩溃时,C# 将开始执行catch,但在那之后,没有任何return 语句。到达现有return users唯一 方法是让一切顺利进行,C# 知道如果发生崩溃可能不会发生这种情况
  • 好的,我看了一下github代码,有几个问题;您的 csv 阅读器已经为您返回了一个列表,但是您随后放置了一个 foreach 并尝试将列表中的每个用户 再次添加到列表中 - 这将不起作用 a) 因为您无法修改列表而您正在枚举它,并且b)无论如何这都不是您想要做的。只需返回调用 ToList() 时获得的用户,完全删除 foreach(您的问题代码更正确;取消注释返回)。你也有我上面提到的那个问题;如果 C# 曾经执行过 catch,它永远不会命中 return 语句
猜你喜欢
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 2018-02-26
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
相关资源
最近更新 更多