从 CSV 文件和 "save" 中读取它的内容以列出对象并将它们加载到 Program.cs
Reading from CSV file and "save" it's contents to List objects and load them in Program.cs
我的小型控制台应用程序的目标是读取 CSV 文件并将其内容保存在列表中(有效)。我有一个单独的 class 用这个方法。请参阅 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 中,我想调用此方法并使用创建的列表的内容来使用登录代码。所以要检查用户名和密码是否输入正确,用户是否可以登录。
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; }
}
}
}
我需要改变什么才能达到我的目标?
您已将 LoadUsersFromCsv 方法声明为“获取列表”:
public void LoadUsersFromCSV(List<User> users)
但您正试图像“什么都不拿,return是一个列表”一样使用它
List<User> users = UserList.LoadUsersFromCSV();
编译器报错,因为您没有在“用户”参数中提供列表
查看代码,它读取文件并将其转换为列表,但没有 return 它也没有填充给定的列表..
我建议您更改 LoadUsers 方法,使其 return 成为它读取的列表,将其从 void 更改为 List<User>
并删除用户参数
我的小型控制台应用程序的目标是读取 CSV 文件并将其内容保存在列表中(有效)。我有一个单独的 class 用这个方法。请参阅 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 中,我想调用此方法并使用创建的列表的内容来使用登录代码。所以要检查用户名和密码是否输入正确,用户是否可以登录。
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; }
}
}
}
我需要改变什么才能达到我的目标?
您已将 LoadUsersFromCsv 方法声明为“获取列表”:
public void LoadUsersFromCSV(List<User> users)
但您正试图像“什么都不拿,return是一个列表”一样使用它
List<User> users = UserList.LoadUsersFromCSV();
编译器报错,因为您没有在“用户”参数中提供列表
查看代码,它读取文件并将其转换为列表,但没有 return 它也没有填充给定的列表..
我建议您更改 LoadUsers 方法,使其 return 成为它读取的列表,将其从 void 更改为 List<User>
并删除用户参数