C# 如何检查函数是否在C上正确运行
嗨,我正在用C写一个程序,它使用一个文本文件来管理用户名和密码。我知道这是一个不好的方法,但这是一个学校项目,也是我第一次做这样的事情 我有一个函数可以删除文本文件中的一行:C# 如何检查函数是否在C上正确运行,c#,C#,嗨,我正在用C写一个程序,它使用一个文本文件来管理用户名和密码。我知道这是一个不好的方法,但这是一个学校项目,也是我第一次做这样的事情 我有一个函数可以删除文本文件中的一行: static public void RemoveUser() { Console.Clear(); Console.WriteLine("Voer naam en wachtwoord in van de gebruiker die u wilt verwijderen."); //here i'm
static public void RemoveUser()
{
Console.Clear();
Console.WriteLine("Voer naam en wachtwoord in van de gebruiker die u wilt verwijderen."); //here i'm asking for the username and password of the user they want to delete
string removedUser = Console.ReadLine();
File.WriteAllLines("db.txt", File.ReadLines("db.txt").Where(l => l != removedUser).ToList());
}
当我现在运行这个函数时,用户输入是invalidtypo,不存在用户,代码运行时不会出错,但不会对文本文件执行任何操作。
我现在想要的是检查函数是否正确,以便在用户输入无效时显示错误,例如,当他们输入错误或试图删除不存在的用户时
我在谷歌上搜索了答案,但什么也找不到
文本文件如下所示:
Verkoper 2
Admin 3
Inkoper 1
您可以事先加载文本文件,并检查是否有任何行与输入匹配,如下所示:
string user = Console.ReadLine();
string[] lines = File.ReadAllText("db.txt").Replace("\r", "").Split('\n');
if (!lines.Contains(user))
{
//handle your invalid user here.
}
在尝试删除文件之前,可以检查文件中是否存在用户:
var users = File.ReadAllLines("db.txt")
.Select(l => var u = l.Split(' '); return new {Name = u[0], Id = u[1]}).ToList();
string removedUser = Console.ReadLine();
if(users.Any(x => x.Name == removeUser))
File.WriteAllLines("db.txt", users.Where(l => l.Name != removedUser).Select(x => $"{x.Name} {x.Id}").ToArray());
else
Console.WriteLine("Invalid username!");
要按Id删除,您可以更改
File.WriteAllLines("db.txt", users.Where(l => l.Name != removedUser).Select(x => $"{x.Name} {x.Id}").ToArray());
到
我建议您使用对象来表示保存的数据,这样您的代码就更有意义了 简单地说:
public class User
{
public string Login { get; set; }
public string Password { get; set; }
}
然后像这样读取您的文件:
static string FilePath = "temp.bak";
static IList<User> Users;
public static bool FileLoad()
{
Users =
File.ReadAllLines(FilePath)
.Where(line => !string.IsNullOrWhiteSpace(line))
.Select(line => new User(line))
.ToList(); ;
return true;
//false: try/catch, corrupted users data, invalid file, etc..
}
现在删除用户可以非常直接和明确:
Users.Where(u => u.Login != "Login_Test_Delete")
我们只需在文件中保留更改:
private static bool Save(IEnumerable<User> demoUserSet)
{
var projection = demoUserSet
.Select(x => x.ToString());
File.WriteAllLines(FilePath, projection);
return true;
// Try/Catch for false. Any retry ? etc.
}
将文件的文本行放入变量中,并使用.Contains进行检查。这样,如果没有一行与学校项目匹配,如果主题不是字符串操作,您可以自己犯错误。去上课。如果提议将某物存储在文件中并检索它,那么某物就是一个对象。它应该有一个好的名字和财产。然后我们从文件到列表customObject。只有真正的列表对象操作。输入列表只是在分隔符上读取全部拆分,然后将其传递给对象构造函数,但这是关于对函数进行单元测试的问题吗?@DragandDrop该项目是用C编写整个程序。从文本文件中删除用户是其中的一部分。我的英语很差,但我只说C。它基本上是在列表上工作字符串的列表很酷,但具有属性的对象列表更酷。这是我的立场,我的第二个评论是关于你的标题。验证特定上下文中操作的正确执行称为单元测试。你的方法不接受任何参数,也不返回任何内容,这使得测试变得更加困难。你丢失了文本行的第二部分。File.ReadAllLinesdb.txt.Wherel=>!l、 拆分“”[0]。包含删除用户。Wille会按过滤位置给您行,这样File.writeAllines不会更改文件completly@DragandDrop是的,你是对的。我编辑了我的答案。@whole,虽然这可能有效。这是一个在线上的包含。而不是密码或登录您存储的任何信息。如果中的用户名包含密码,它将删除行。如果要删除的用户是空格,则您已删除所有行。@DragandDrop包含的内容与整个元素匹配,否?不是元素的子字符串。是的,这是一个非常简陋的方法,但使用不会删除所有用户。是的,我的错。它不是字符串包含,而是数组包含。因此,他必须计算准确的时间来删除它。
Users.Where(u => u.Login != "Login_Test_Delete")
private static bool Save(IEnumerable<User> demoUserSet)
{
var projection = demoUserSet
.Select(x => x.ToString());
File.WriteAllLines(FilePath, projection);
return true;
// Try/Catch for false. Any retry ? etc.
}