如何通过用户输入(控制台应用程序)在C#中使用IndexOf方法和列表自动增加int userid?
我使用以下方法(Register)的目标是在管理员填写用户详细信息并将其保存在列表中时自动增加userid,最终将新添加的用户写入csv文件。每次加载应用程序时都会读取csv文件。最后两种方法非常有效 这是进行用户输入的方法,我想在其中自动增加用户ID:如何通过用户输入(控制台应用程序)在C#中使用IndexOf方法和列表自动增加int userid?,c#,list,csv,auto-increment,indexof,C#,List,Csv,Auto Increment,Indexof,我使用以下方法(Register)的目标是在管理员填写用户详细信息并将其保存在列表中时自动增加userid,最终将新添加的用户写入csv文件。每次加载应用程序时都会读取csv文件。最后两种方法非常有效 这是进行用户输入的方法,我想在其中自动增加用户ID: public void Register(List<User> users) { int userid = users.LastIndexOf(userid);
public void Register(List<User> users)
{
int userid = users.LastIndexOf(userid);
if (userid < users.LastIndexOf(userid))
{
userid++;
}
// Get user input
Console.WriteLine("Enter username:");
string username = Console.ReadLine();
Console.WriteLine("Enter email:");
string email = Console.ReadLine();
Console.WriteLine("Enter password:");
string password = Console.ReadLine();
Console.WriteLine("Enter userrole (typ admin, purchase or sales):");
string userrole = Console.ReadLine();
// Create fresh instance to save input in memory
User user = new User(userid, username, email, password, userrole);
// Adds the user to the excisting list
users.Add(user);
FileOperations fo = new FileOperations();
// Calling the method from FileOperations.cs to write the List here to a CSV file
fo.WriteUsersToCSV(users);
}
public void Register(List<User> users)
{
int userid = 3;
userid++;
// Get user input
Console.WriteLine("Enter username:");
string username = Console.ReadLine();
Console.WriteLine("Enter email:");
string email = Console.ReadLine();
Console.WriteLine("Enter password:");
string password = Console.ReadLine();
Console.WriteLine("Enter userrole (typ admin, purchase or sales):");
string userrole = Console.ReadLine();
// Create fresh instance to save input in memory
User user = new User(userid, username, email, password, userrole);
// Adds the user to the excisting list
users.Add(user);
FileOperations fo = new FileOperations();
// Calling the method from FileOperations.cs to write the List here to a CSV file
fo.WriteUsersToCSV(users);
}
当我尝试下面的代码时,它会保存并写入csv文件,但不会继续自动增加用户ID:
public void Register(List<User> users)
{
int userid = users.LastIndexOf(userid);
if (userid < users.LastIndexOf(userid))
{
userid++;
}
// Get user input
Console.WriteLine("Enter username:");
string username = Console.ReadLine();
Console.WriteLine("Enter email:");
string email = Console.ReadLine();
Console.WriteLine("Enter password:");
string password = Console.ReadLine();
Console.WriteLine("Enter userrole (typ admin, purchase or sales):");
string userrole = Console.ReadLine();
// Create fresh instance to save input in memory
User user = new User(userid, username, email, password, userrole);
// Adds the user to the excisting list
users.Add(user);
FileOperations fo = new FileOperations();
// Calling the method from FileOperations.cs to write the List here to a CSV file
fo.WriteUsersToCSV(users);
}
public void Register(List<User> users)
{
int userid = 3;
userid++;
// Get user input
Console.WriteLine("Enter username:");
string username = Console.ReadLine();
Console.WriteLine("Enter email:");
string email = Console.ReadLine();
Console.WriteLine("Enter password:");
string password = Console.ReadLine();
Console.WriteLine("Enter userrole (typ admin, purchase or sales):");
string userrole = Console.ReadLine();
// Create fresh instance to save input in memory
User user = new User(userid, username, email, password, userrole);
// Adds the user to the excisting list
users.Add(user);
FileOperations fo = new FileOperations();
// Calling the method from FileOperations.cs to write the List here to a CSV file
fo.WriteUsersToCSV(users);
}
哦,前3个用户是默认用户!他们需要留在CSV中。这就是为什么我启动int userid=3
使用已实施的反馈进行更新:
我根据反馈调整了我的方法:
public void Register(List<User> users)
{
User usr = users.OrderByDescending(u => u.userid).FirstOrDefault();
int userid = (usr == null ? 1 : usr.userid++);
// Get user input
Console.WriteLine("Enter username:");
string username = Console.ReadLine();
Console.WriteLine("Enter email:");
string email = Console.ReadLine();
Console.WriteLine("Enter password:");
string password = Console.ReadLine();
Console.WriteLine("Enter userrole (typ admin, purchase or sales):");
string userrole = Console.ReadLine();
// Create fresh instance to save input in memory
User user = new User(userid, username, email, password, userrole);
// Adds the user to the excisting list
users.Add(user);
FileOperations fo = new FileOperations();
// Calling the method from FileOperations.cs to write the List here to a CSV file
fo.WriteUsersToCSV(users);
}
它添加了用户,但现在最后一个用户在添加新用户(Bas)时获得了不同的用户ID
以下是我要确保的用户类:
namespace GimpiesConsoleOOcsvListUI
{
public class User
{
// Constructor
public User(int userid, string username, string email, string password, string userrole)
{
_UserId = userid;
_UserName = username;
_Email = email;
_Password = password;
_UserRole = userrole;
}
private int _UserId;
private string _UserName;
private string _Email;
private string _Password;
private string _UserRole;
public int userid
{
get { return _UserId; }
set { _UserId = value; }
}
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; }
}
}
}
更新2:
我尝试了下面评论中的建议。但是我现在在我的csv文件中得到这个输出。与执行Console.WriteLine以在内存中显示列表时相同:
userid,username,email,password,userrole
1,Inkoop,inkoop@gimpies.nl,123,purchase
2,Verkoop,verkoop@gimpies.nl,123,sales
5,Beheer,beheer@gimpies.nl,123,admin
3,Bas,bas@bas.bl,123,admin
4,Tim,tim@tim.nl,123,sales
如您所见,新添加的用户Bas和Tim将获得用户ID 3和4。已经存在的用户Beheer从userid3变为userid5。所以userid++可以工作,但不是我想要的方式
三个默认用户(Inkoop、Verkoop和Beheer)应该保持用户标识1、2和3。新用户应该从4开始,以此类推
我注册新用户的方法:
public void Register(List<User> users)
{
User usr = users.OrderByDescending(u => u.userid).FirstOrDefault();
int userid = (usr == null ? 1 : usr.userid++);
// Get user input
Console.WriteLine("Enter username:");
string username = Console.ReadLine();
Console.WriteLine("Enter email:");
string email = Console.ReadLine();
Console.WriteLine("Enter password:");
string password = Console.ReadLine();
Console.WriteLine("Enter userrole (typ admin, purchase or sales):");
string userrole = Console.ReadLine();
// Create fresh instance to save input in memory
User user = new User(userid, username, email, password, userrole);
// Adds the user to the excisting list
users.Add(user);
FileOperations fo = new FileOperations();
// Calling the method from FileOperations.cs to write the List here to a CSV file
fo.WriteUsersToCSV(users);
}
公共作废登记簿(列出用户)
{
User usr=users.OrderByDescending(u=>u.userid).FirstOrDefault();
int userid=(usr==null?1:usr.userid++);
//获取用户输入
Console.WriteLine(“输入用户名:”);
字符串username=Console.ReadLine();
Console.WriteLine(“输入电子邮件:”);
字符串email=Console.ReadLine();
Console.WriteLine(“输入密码:”);
字符串密码=Console.ReadLine();
Console.WriteLine(“输入用户角色(典型的管理员、采购或销售):”;
字符串userrole=Console.ReadLine();
//创建新实例以将输入保存在内存中
用户=新用户(用户ID、用户名、电子邮件、密码、用户角色);
//将用户添加到激励列表
用户。添加(用户);
FileOperations fo=新的FileOperations();
//从FileOperations.cs调用该方法以将此处的列表写入CSV文件
fo.WriteUsersToCSV(用户);
}
我的写入csv文件方法:
public void WriteUsersToCSV(List<User> users)
{
// overwrite the file each time; indicated by the `false` parameter
using (var writer = new StreamWriter("users.csv", false))
using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
User usr = users.OrderBy(u => u.userid).FirstOrDefault();
// csvWriter.Configuration.HasHeaderRecord = false; // commented out as we write the whole file every time including the header
csvWriter.WriteRecords(users);
Console.WriteLine("New user added to users.csv");
}
}
public void WriteUsersToCSV(列出用户)
{
//每次覆盖文件;由'false'参数指示
使用(var writer=newstreamwriter(“users.csv”,false))
使用(var csvWriter=new csvWriter(writer,CultureInfo.InvariantCulture))
{
User usr=users.OrderBy(u=>u.userid).FirstOrDefault();
//csvWriter.Configuration.HasHeaderRecord=false;//在每次写入整个文件(包括头)时注释掉
csvWriter.WriterRecords(用户);
WriteLine(“添加到users.csv的新用户”);
}
}
我认为,由于列表中对象的位置在某种程度上影响了userid++。。。我还尝试更改用户。添加到用户。插入(3,用户)。但也显示了同样的结果。我缺少什么?用户变量是一个
列表。您无法在此列表中搜索每个用户的属性UserId。编译器无法理解传递给LastIndexOf的整数应该用于在列表中搜索具有该id的用户。这正是编译器显示的错误的含义
幸运的是,我们可以将Linq用于此类任务。因此,搜索具有特定用户ID的用户非常简单
User usr = users.FirstOrDefault(u => u.UserId == 3);
如果列表中存在userid=3的用户实例,则返回该实例;否则返回null
但是在你的代码中你需要更多的东西。您需要知道最后插入(或从文件重新加载)的用户ID,然后在将其分配给下一个用户之前增加该值。同样,在Linq名称空间中,我们可以找到另一个帮助我们的方法
public void Register(List<User> users)
{
User usr = users.OrderByDescending(u => u.UserID).FirstOrDefault();
int nextUserId = (usr == null ? 1 : usr.UserId++);
.....
公共作废登记簿(列出用户)
{
User usr=users.OrderByDescending(u=>u.UserID).FirstOrDefault();
int-nextUserId=(usr==null?1:usr.UserId++);
.....
这将按用户ID降序排列用户序列,然后我们再次使用序列的第一个元素。现在为下一个用户增加用户ID是很简单的。这是解决我问题的答案:
int userid = (usr == null ? 1 : usr.userid + 1);
谢谢。我将编辑我的第一篇帖子来展示你的建议。它会做一些有趣的事情。这并不重要。List类不能保证你保持任何顺序。它会按照元素添加的顺序保留元素。重要的是没有用户具有相同的id。如果你添加一个新用户会发生什么?它是否获得userid=5?如果您希望以特定顺序存储用户,则应更改WriteUsersToCSV,以设置用户=users.OrderBy的特定顺序(u=>u.useridSomething正在更改用户ID。请检查分配用户ID值的每个位置。OrderBy、OrderByDescending或FirstOrDefault无法更改用户ID值。此外,请检查加载文件的代码。我还建议您发布一个新问题,重点关注最后一个问题。这个问题已从最初的问题发展为总体问题不同的。
int userid = (usr == null ? 1 : usr.userid + 1);